2016-07-16 7 views
0

the question暗黙的にアンラップされたオプションのとき初期化時に定義することはできません定数が、エラーが

に彼の答えですべてのメンバーの定数は、初期化が完了した時点で値を持っている必要がありますDrewagでは付属しています。場合によっては、初期化中に定数を正しい値で初期化することはできませんが、アクセス前に値を持つことが保証されます。

Optional変数を使用すると、この問題が回避されます。これは、Optionalが自動的にnilで初期化され、最終的には変更されない値が変更されないためです。しかし、確かにあなたが知っている変数が常にゼロではないことを知っていると、痛みを伴うことがあります。暗黙的にアンラップされたオプションは、オプショナルと同じ利点を実現します。

次のコードは、プロパティとして、他のクラスのインスタンスを格納し、それぞれが2つのクラス、CountryCityを定義します。すべての国に首都がなくてはならず、すべての都市は常に国に属していなければなりません。私はlet capitalCity: City!にラインvar capitalCity: City!を変更した場合

class Country { 
    let name: String 
    var capitalCity: City! //why I can't use let! 
    init(name: String, capitalName: String){ 
     self.name = name 
     self.capitalCity = City(name: capitalName, country: self) 
    } 

    deinit { 
     print("\(name) has been de-initialized the city \(capitalCity.name) is gone with with the country") 
    } 

} 

class City{ 
    let name: String 
    unowned let country: Country 
    init(name: String, country: Country){ 
     self.name = name 
     self.country = country 
    } 

    deinit { 
     print("The city \(name) has been de-initialized ") 
    } 
} 

    var country = Country(name: "Canada", capitalName: "Ottawa") 
} 

しかし、コンパイラは、次のエラー警告を与えられました。

enter image description here

質問:定数初期化時に定義することができないときに我々は暗黙的にアンラップされたオプションを使用することができませんか?ここのエラーは何ですか?私が間違っていると理解すれば、あなたが指摘して助けてくれることを感謝します。

答えて

1

重要な部分はここにある:

City(name: capitalName, country: self) 

あなたは間違いなく財産capitalCityへの代入の前に実行される式でselfを使用しています。

あなたが式のいずれかでselfを使用したい場合は、すべてのプロパティがselfの使用前に初期化する必要があることを意味しており、two phase initializationの第二段階にする必要があります。

varを使用すると、SwiftはプロパティcapitalCityにデフォルトの初期値nilを割り当てます。したがって、プロパティは「既に初期化済み」とみなすことができるため、別のプロパティnameを初期化した後にselfを使用することができます。

(。あなたは、LET-定数ImplicitlyUnwrappedOptionalのにnilを与えることばかげている知っている)

方法private(set) varによっては、多くの場合、同様の例で使用されている:あなたの助けと説明のため

private(set) var capitalCity: City! 
+0

感謝を。私はDrewagの記述が間違っていると思うか、間違っていると私は理解しています。私はまた、Implicit Unwrapped Optionが最初に定数に無限大を与えた後、それに不変の値を与える方法が不思議でした – SLN

関連する問題