2020/1/12 Swift イニシャライザ(Initialization)工事中🏗

初期化(Initialization)は、クラス・構造体・列挙型のインスタンスを準備するプロセスです。このプロセスはインスタンスのストアドプロパティの初期化と、その他のインスタンスを使用するに際必要なセットアップや初期化が含まれます。

イニシャライザを定義することで初期化処理を実装します。イニシャライザは特定の型のインスタンスが生成される際呼び出される特別なメソッドです。Swiftのイニシャライザは値を返しません。イニシャライザの一番の役割は、インスタンスが初めて使われる時に正常に初期化されていることを確実にすることです。

クラス型のインスタンスはデイニシャライザを実装することもできます。デイニシャライザはクラスのインスタンスが削除(割当解除)される直前に独自のクリーンアップをします。

ストアドプロパティの初期化

クラスと構造体はインスタンスが生成される時までに、全てのストアドプロパティが適切な値で初期化されていなければなりません。ストアドプロパティの値が不確定のままの状態は許されません。

ストアドプロパティの初期化方法としては、イニシャライザによる初期化、あるいはストアドプロパティの宣言時にデフォルト値を代入する方法があります。

NOTE

イニシャライザによる初期化時、あるいは宣言時のデフォルト値の代入時は、プロパティオブザーバが呼ばれることはありません。

イニシャライザ

イニシャライザは、特定の方のインスタンス生成時に呼び出されます。一番基本的なイニシャライザの定義は以下のようにインスタンスメソッドのように定義します。

sample1-1

init() {
    // perform some initialization here
}

sample1-2ではFahrenheitで表現される温度を格納するFahrenheit構造体を定義しています。一つのDouble型のストアドプロパティtemperatureを持っています。

sample1-2

struct Fahrenheit {
    var temperature: Double
    init() {
        temperature = 32.0
    }
}
var f = Fahrenheit()
print("The default 

Swift プロトコル、プロトコルのプロパティ

プロトコルにプロパティを定義する

protocol プロトコル名{
    var プロパティ名 : 型名{get} //ゲッターのみ必要
}

protocol プロトコル名{
    var プロパティ名 : 型名{get set}  //ゲッターとセッターが必要
}

プロトコルにプロパティを定義する場合上記のようにプロパティ名・型名・ゲッターとセッターの有無を定義します。

プロパティは常にvarキーワードで宣言します。


(プロパティの実装を要求する)プロトコルに準拠する

プロトコルは、準拠する型(sample1では構造体)に対して実装を要求します。

準拠する型が、プロトコルが要求するプロパティを実装する方法、つまりプロトコルに準拠する方法が以下です。

sample1

protocol ProtocolA{
    var prop:Int{get}
}

struct StructA:ProtocolA{
    var prop:Int  //←変数のストアドプロパティ
}

struct StructB:ProtocolA{
    let prop:Int  //←定数のストアドプロパティ

Swiftの基本 イニシャライザ、パート2

パート1でイニシャライザの定義、挙動を見ました。そこで次のサンプル(sample1)

sample1

struct Sample{
    let prop1:Int    //構造体定義時にプロパティを初期化していない
    let prop2:String
    let prop3:String
    //イニシャライザを定義していない
}

let sample1=Sample(prop1:10,prop2:"wow",prop3:"good")

print(sample1.prop1)
print(sample1.prop2)
print(sample1.prop3)
10
wow
good

構造体Sample型に定義されているのは

prop1(Int型)

prop2(String型)

prop3(String型)

のみで、イニシャライザは定義されていません。さらに構造体Sample定義時にプロパティを初期化していません。しかし実際実行すると期待通りに結果が出力され、エラーは出ません。つまりイニシャライザを定義していないが、すべてのプロパティが初期化されています。


構造体の場合、イニシャライザを自分で定義しない場合、自動的にメンバワイズイニシャライザ(memberwise initializer)が内部的に用意されます。

メンバワイズイニシャライザは、型が持つすべてのストアドプロパティを引数に持つイニシャライザで、上記の例だと、

init(prop1:Int,prop2:String,prop3:String){
    self.prop1=prop1
    self.prop2=prop2
    self.prop3=prop3
}

このようなイニシャライザを定義したのと同じ状態(実際には定義していない)になります。

ということで、sample1を見ると一見エラーが出そうですが、実際エラーは出ずにすべてのプロパティが初期化されている、ということですね。