2016-05-04 8 views
1

私は非常に迅速です。 Appleから次の文書が見つかりました。オプションのストアド・プロパティー初期化

クラスおよび構造、そのクラスのインスタンスまたは 構造が作成される時点で 適切な初期値にその記憶されているすべてのプロパティを設定する必要があります。格納されたプロパティは、 不定状態のままにすることはできません。

イニシャライザ内に格納されたプロパティの初期値を設定するか、 プロパティの定義の一部としてデフォルトのプロパティ値を割り当てることで設定できます。これらの操作については、次の セクションで説明しています。

以下のコードnoOfTyresは初期化されておらず、コンパイラはこれを説明しませんので、これを説明してください。

class Vehicle 
{ 
    var noOfTyres: Int! 
    var engineCapacity: Int 

    init() 
    { 
     engineCapacity = 10 
    } 

} 
+2

'noOfTyres'は_implicitly unwrapped optional_です。デフォルト値はnilです。 'noOfTyres'が設定されていないので、' vehicle().noOfTyres + 5'のようなものを試してみるとアプリケーションがクラッシュするでしょう。 –

+2

";"必要ない。 – Lucho

答えて

1

あなたの場合、コンパイラは、その値を使用しようとするまで、文句を言わないでしょう。ラップされていない値(!)を持つので、値がゼロにならず、値にアクセスしようとするとクラッシュします。

この場合、プロパティnoOfTyresにデフォルト値を追加します。

var noOfTyres: Int = 2 

または、コンストラクタに値を追加して、オブジェクトが作成されるたびに値を設定する必要があります。

class Vehicle 
{ 
    var noOfTyres : Int! 
    var engineCapacity :Int 

    init(noOfTyres: Int) 
    { 
     self.noOfTyres = noOfTyres 
     engineCapacity=10; 
    } 

} 

これがオプションでない場合、プロパティは決してゼロにならないということを覚えておいてください。

もう1つのことは、従来通り、クラス名は大文字にする必要があります。

1

このプロパティをオプションにすると、ストアドプロパティに初期値を割り当てずに宣言できます。プロパティは、値を持つか、またはnilです。オプションのプロパティは、どちらか

var myOptional : Int? 

または

var myOptional : Int! 

で宣言されているので、noOfTyresが初期化されていない、それはオプションである一方で、現在はそれがnilに設定されています。

詳細については、Apple documentationをご覧ください。

追加情報さまざまなタイプの宣言(!と?)については、this postで説明しています。

+0

私があなたが言及した投稿と、私が混乱しているドキュメントは、「文字列!暗黙のうちにラップされていないオプションです。値が常に初期化されたことを示します」 私は質問に投稿したコードは、それもuninitialisedすることができますが、私は値を割り当てられていない場合、私は実行時エラーが発生する可能性があります。しかし、他のストアドプロパティの初期化されていない場合、コンパイラはエラーを与えるでしょう。異なる –

+0

これは当てはまります。私は、実行時に値があり、そのプロパティがnilではないことを期待しているので、暗黙的にアンラップされたオプションを宣言するのは良いコーディング方法ではないと思います。プロパティがnilの場合、アプリはクラッシュします。オプションのプロパティを!と宣言するあなたのコードをより少なく保存します。これは迅速で、安全で、速く、表現力豊かなコードの目的です。私はそれがあなたの質問に答えたと思う。 – MacUserT

0

これはドキュメントが言う答え

ことができるかどうかは、オプションが最初に定義された後に、オプションの値がすぐに存在することが確認されたときに

が暗黙的に開封されたoptionalsが有用で、わからないとその後のあらゆる時点で存在すると確信することができる。初期化として、したがってその間違いなく我々は、実行時に値なしでアクセスした場合は保存されたプロパティなどのオプションを使用して、それがあるとすれば、それは

をクラッシュしますvalue.Butを含む、コンパイラが期待

他の格納されたプロパティのアトラス値は&です。初期化が必要です。