はthe question暗黙的にアンラップされたオプションのとき初期化時に定義することはできません定数が、エラーが
に彼の答えですべてのメンバーの定数は、初期化が完了した時点で値を持っている必要がありますDrewagでは付属しています。場合によっては、初期化中に定数を正しい値で初期化することはできませんが、アクセス前に値を持つことが保証されます。
Optional変数を使用すると、この問題が回避されます。これは、Optionalが自動的にnilで初期化され、最終的には変更されない値が変更されないためです。しかし、確かにあなたが知っている変数が常にゼロではないことを知っていると、痛みを伴うことがあります。暗黙的にアンラップされたオプションは、オプショナルと同じ利点を実現します。
次のコードは、プロパティとして、他のクラスのインスタンスを格納し、それぞれが2つのクラス、Country
とCity
を定義します。すべての国に首都がなくてはならず、すべての都市は常に国に属していなければなりません。私は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")
}
しかし、コンパイラは、次のエラー警告を与えられました。
質問:定数初期化時に定義することができないときに我々は暗黙的にアンラップされたオプションを使用することができませんか?ここのエラーは何ですか?私が間違っていると理解すれば、あなたが指摘して助けてくれることを感謝します。
感謝を。私はDrewagの記述が間違っていると思うか、間違っていると私は理解しています。私はまた、Implicit Unwrapped Optionが最初に定数に無限大を与えた後、それに不変の値を与える方法が不思議でした – SLN