class HTMLElement {
let name : String
let text: String?
//Declaring a lazy variable that has a strong reference to this closure
lazy var asHTML: Void -> String = {
//Optional binding here
if let text = self.text {
return "<\(self.name)>\(text)<\(self.name)>"
} else {
return "<\(self.name) >"
}
}
init(name: String, text: String? = nil){
self.name = name
self.text = text
}
deinit {
print("\(name) is being deinitialized")
}
}
私の質問は: クロージャーが Lazy と宣言されているのはなぜですか? クロージャーで認識されていないことに関係があることはわかっていますが、作成されていないメソッドself
の場合も同じではありませんか?init
self
第二に、このコード例の強い参照サイクルは正確にはどこですか?それself
は を強く参照してasHTML
いますか?もしそうなら、サイクルを引き起こす強い参照の 2 番目の部分はどこですか?
第三に、定数が値をtext
変更できないのに、定数プロパティがオプションである理由は何ですか?nil
nil
最後に、メソッドがユーザーから送信されたパラメーターを受け入れるために使用されている場合、text: String? = nil
メソッドにパラメーターがあるとはどういう意味ですか?init
init
この長い質問で申し訳ありませんが、クロージャの強参照サイクルについて混乱しています....クラスプロパティとクラスインスタンス間の強参照サイクルは理解していますが。