Swift の struct(構造体)
ここでは Swift の struct(構造体)についてご説明します。
Swift の struct の基本
Swift の struct(構造体)では、値を保持するためのプロパティや関連する機能のメソッドなどをまとめて定義しておいて、必要な時にその struct のインスタンスを生成して使うことができます。
struct と class の構文は同じですが、struct のほうは継承やデイニシャライズができないなどの違いがあります。
struct ではイニシャライザー init() を自分で定義することもできますが、定義しなくてもエラーにならず、デフォルトのイニシャライザーがついてくる感じで、インスタンス生成時にプロパティの値を引数として渡すことができます。
class のほうが多機能である分複雑で、Swift の公式ドキュメントでは特に必要がない限り struct を使うことがおすすめされています。
Swift の struct(構造体)を定義するには、struct キーワードを使って次のような構文で定義します。
struct Struct名 {
var プロパティ名1: データ型1
var プロパティ名2: データ型2
func メソッド名() {
メソッドのコードブロック
}
}
例えば、名前と年齢をプロパティに持ち、あいさつをする greet メソッドを持つ、Person という struct を定義したい時は次のようにできます。
struct Person {
var name: String
var age: Int
func greet() {
print("Hello! My name is \(name), and I'm \(age) years old.")
}
}
Swift の struct の使い方
Swift の struct のインスタンスを生成するには、基本的には次のようにできます。
var 変数名 = Struct名(プロパティ名1: プロパティ名1の値, プロパティ名2: プロパティ名2の値, ...)
他のデータ型と同様に、変更する必要がない時は let 定数名 = ... でも大丈夫です。
プロパティには初期値が設定できますが、初期値がない時は、インスタンスを生成する時にプロパティの値を渡す必要があります。
初期値がある時は、インスタンス生成時の引数はオプショナルになります。
プロパティの値を変更したい時は、Struct名.プロパティ名1 = 新しい値 のようにして変更できます。
そして、メソッドを実行する際は Struct名.メソッド名() のように実行します。
それでは、先ほど定義した Person 構造体を使ってみましょう。
struct Person {
var name: String
var age: Int
func greet() {
print("Hello! My name is \(name), and I'm \(age) years old.")
}
}
var p1 = Person(name: "Haruka", age: 15)
p1.greet()
p1.age = 20
p1.greet()
実行結果は次のようになります。
Hello! My name is Haruka, and I'm 15 years old.
Hello! My name is Haruka, and I'm 20 years old.
Swift の struct は値型
もう一点、Swift の struct と class の違いは、struct は値型で、class は参照型であるという点です。
例えば、次のように struct をコピーして新しい struct を生成し、新しく生成した struct のプロパティーの値を変更しても、別のインスタンスなので元の struct のプロパティの値は変更されません。
struct Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func greet() {
print("Hello! My name is \(name), and I'm \(age) years old.")
}
}
var p1 = Person(name: "Haruka", age: 15)
var p2 = p1
p2.age = 20
p1.greet()
p2.greet()
実行結果は次のようになります。p2 の age を 20 に変更しても、p1 の age は 15 のままになっていますね。
Hello! My name is Haruka, and I'm 15 years old.
Hello! My name is Haruka, and I'm 20 years old.
このコードの struct を class に変更して実行すると、p1 と p2 は同じインスタンスへの参照になるので、p2 の age を 20 に変更すると、p1 の age も 20 になります。
以上、Swift の struct(構造体)についてご説明しました。