krsakai / iOSStudy

1 stars 0 forks source link

イニシャライザについて #29

Closed krsakai closed 7 years ago

krsakai commented 7 years ago

イニシャライザについて

イニシャライザはクラスのインスタンスを生成する時の初期化処理のことで、UIView() ← こんな感じでインスタンス生成するやつの事を言います

Swiftのイニシャライザには結構パターンがあり全てを覚えるのは大変なので、概要だけ学べればおkかと

基本Struct(構造体)やEnum(列挙型)やiOSKitが用意したクラスを継承したクラス(UIViewController等)では、イニシャライザが既に用意されている(暗黙的イニシャライザ)ので、イニシャライザ設計とかしない事が多いが、自分でクラス設計する場合は、イニシャライズ(初期化)しておくべき物の定義をします

まぁイニシャライザを一言で言うならば、 このクラスを生成するにあたって、インスタンス生成時に初めに値を必ず入れて生成してもらうための仕組み です

それを実現するために、イニシャライザの仕組みがSwiftの方で色々用意されていて、 詳しく知りたい場合は → http://qiita.com/totomo/items/8ec7f103538d017a4208

クラスにイニシャライザ制限をかけなければ、UIViewController() みたいに、引数なしでクラスのインスタンスを作れるようになっていますが、生成するクラスに初期化が必須なプロパティなどが存在する場合、()で生成されては困るため、そういった制限が掛かるようにSwiftの方で設計されています

で、オプショナルと定数/変数周りの勉強になるので少し解説しておくと、

↓ クラスを定義した時に下記の内、構文エラーで怒られるのはどれか

// 1
class Test {
    var string: String
}
// 2
class Test {
    var string: String?
}
// 3
class Test {
    var string: String!
}
// 4
class Test {
    var string: String = ""
}
// 5
class Test {
    var string: String {
        return ""
    }
}
// 6
class Test {
    let string: String
}
// 7
class Test {
    let string: String?
}
// 8
class Test {
    let string: String!
}
// 9
class Test {
    let string: String = ""
}

↑ の内、 ①と⑥と⑦と⑧が構文エラーになります

① は 値が設定されていない変数なので初期化メソッドでの初期化が必要 ② は オプショナル変数で nil で初期化されるため初期化が不必要 ③ は 強制アンラップオプショナル変数も nil で初期化されるため初期化が不必要 ④ は 値が設定されているので初期化が不必要 ⑤ はComputed Property(計算プロパティ)なので、そもそも値保持しないので初期化の必要がない ⑥ は 値が設定されていない定数なので初期化メソッドでの初期化が必要 ⑦ は オプショナル定数なので nilで初期化してしまうとそもそも nilにしかならないので nilは代入されず、初期化メソッドでの初期化が必要。(定数は再代入が不可な仕組みなので) ⑧ ⑦と同じ理由により初期化メソッドでの初期化が必要 ⑨ は 値が設定されている定数なので、初期化メソッドでの初期化は不要

class Test {
    let string1: String?         // A
    let string2: String = ""   // B
    var string3: String!        // C
}

Aは定数のため後からも値を設定できないためオプショナルな値でも初期化が必要 Bは本当の定数で初期化不要 Cはnilで初期化されるので初期化不要 初期化後に後から値を設定してもOK とりあえずこれを覚えとけば混乱が減るはず