この記事では「The Swift Programming Language」を1から読んだ感想とか発見を書いてみようと思います。
「The Swift Programming Language」とはSwiftの公式ドキュメントでiBooksや下ページで見る事ができます。
The Swift Programming Language (Swift 2): About Swift
読んだ所
今回はClasses and Structures
という項目を読みました。
The Swift Programming Language (Swift 2): Classes and Structures
学んだこと
構造体の初期化
構造体の良い所として、MyStruct(width: 100, height: 100)
のようにプロパティーをセットするInitializerが自動で実装される点があります。
struct MyStruct { var width = 0 var height = 0 } let struct1 = MyStruct(width: 100, height: 100) let struct2 = MyStruct() // プロパティーをセットしない初期化もできる // ↓ のように片方のプロパティーに対するInitializerはない // let struct1 = MyStruct(height: 100)
しかし片方のプロパティーをセットするInitializerは作られないので自作する必要があります。
// ↓ のように片方のプロパティーに対するInitializerはない // let struct1 = MyStruct(height: 100)
Initializerが自動で生成されるので、下のようにプロパティーに初期値をセットされなくてもエラーになりません。
struct MyStruct { var width: Int var height: Int }
その場合はMyStruct(width: 100, height: 100)
というInitializerを呼ぶことが必須になります。
struct MyStruct { var width: Int var height: Int } // ↓ プロパティーの初期値をセットしてないのでこの書き方はできない let struct = MyStruct()
クラスの比較
クラスが同じインスタンスかどうかは===
で判定します。
構造体は===
が使えませんでした。
===
は変数のメモリ番地が等しいかどうかなので、変数に直接値が入っている構造体では使えないのかもしれません。
let a = NSIndexPath() let b = NSIndexPath() let c = a print(a == b) // true print(a === b) // false → a == bと違ってtrueにならない print(a !== b) // true print(a === c) // true
構造体の使いどき
構造体は簡単なデータ構造を作る時に使うのが良さそうです。
常に値渡しなので変数の受け渡し時に受け渡し元に影響を与えないからです。
struct MyStruct { var width: Int var height: Int } var myStruct1 = MyStruct(width: 100, height: 100) var myStruct2 = myStruct1 myStruct2.width = 10 print(myStruct1.width) // → 100のまま class MyClass { var width = 0 var height = 0 } let myClass1 = MyClass() let myClass2 = myClass1 myClass2.width = 10 print(myClass1.width) // → 10になっている
しかし値渡しなのであまりに大きな変数や代入が何度も発生する変数には使わない方が良さそうです。
あと継承が使えないので、継承を使い時も利用しないほうが良いです。