2016-09-05 5 views
-2

私はSwiftのイニシャライザの周りに頭を抱えようとしています。私は彼らが何をするのかを知っているが、なぜ私はそれらが必要なのか分からない。SwiftでInitializersを使用するのはなぜですか?

例えば:(リンゴのドキュメントから)

class NamedShape { 
    var numberOfSides = 0 
    var name: String 
    var sideLength: Double 

    init(name: String, sideLength: Double) { 
     self.name = name 
     self.sideLenght = sideLength 
    } 
} 

self.sideLengthはなく、単に「sideLength」の実際の値は、等しくないはずinitは、初期値を設定する必要がある場合。あるいは、関数に引数を取り入れるためにinitを作成する必要がありますか?

私はとても混乱していますが、誰かが私を助けることができたら本当に感謝します。

+0

名前とsideLength初期化子を呼び出すときに設定されます。self.sideLengthはクラスプロパティです。sideLengthは初期化子パラメータです。 –

+1

numberOfSidesで宣言したときにinitを初期化するとinitは必須ではありません。 –

+0

BTW常にクラスプロパティを定数にし、必要な初期化子を追加する必要があります。プロパティを変更する必要がある場合は、新しいオブジェクトを作成してください。 –

答えて

1

初期化プログラムの主な目的は、非オプション変数を初期化することです。クラスには、numberOfSides、name、およびsideLengthという3つの変数があります。 numberOfSidesには初期値としてゼロが与えられているので、それは満足です。ただし、nameとsideLengthには値はありません。これは非オプションの場合は「不正」です。したがって、イニシャライザで値を指定する必要があります。たとえば、initの行の1つをコメントアウトすると、その変数が初期化されないため、コンパイルエラーが発生します。コンパイル時に論理的に初期値を決めることができないときにこれを行います。これは、numberOfSidesの場合もそうであると主張することができます。

コード内でnumberOfSidesが1以上であることを検証したい場合は、コンパイル時にnumberOfSidesを未定義にしてinitに渡します。これにより、少なくとも1でない場合は、 (これは、利用可能なinitialiser-initを使用することを意味するでしょう)。

あなたのケースでは、初期設定子で渡された名前がクラスの名前変数と同じではないことに注意してください。これはあなたがする必要がある理由です:

self.name = name 

クラス内の変数に初期化子で渡された名前の値をコピーするには。

+0

情報ありがとうございます! –

関連する問題