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
,如果是,导致循环的强引用的第二部分在哪里?
text
第三,当常量不能改变值时,为什么常量属性是可选的(从nil
到一个值并返回到nil
)?
最后,当方法用于接受用户发送的参数时,方法中有参数text: String? = nil
是什么意思?init
init
抱歉这个长问题,我只是对闭包强引用循环感到困惑......虽然我确实理解类属性和类实例之间的强引用循环。