しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swift再入門10 − The Swift Programming Languageを読んでみる

この記事では「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になっている

しかし値渡しなのであまりに大きな変数や代入が何度も発生する変数には使わない方が良さそうです。
あと継承が使えないので、継承を使い時も利用しないほうが良いです。