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")
}
}
My Question is: Why is the closure declared Lazy, I know it has something to do with self
not being known in the closure, but isn't that the same case for the init
method where self
hasn't been created?
Secondly,Where exactly is the strong reference cycle in this code example, is it self
that strongly references to asHTML
, if so where is the second part of the strong referencing that causes the cycle?
Third, Why is the constant text
property an optional when constants cannot change value(from nil
to a value and back to nil
)?
Lastly, What does it mean to have the parameter text: String? = nil
in the init
method when the init
method is used to accept parameters sent by the user?
Sorry for this long question, I'm just confused on the closure strong reference cycle....although I do understand strong reference cycles between class properties and class instances.