Различные замыкания, дающие разные результаты для сохранения циклов в Swift
Я читаю Руководство по языку программирования Swift от Apple. В части о Strong Reference Cycle для замыканий я пробовал другой тип замыкания, но он не дал ожидаемого результата.
class HTMLElement {
let name: String
let text: String?
lazy var asHTML : String = {
//[unowned self] in
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 {
println("\(name) is being deinitialized")
}
}
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world")
println(paragraph!.asHTML)
paragraph = nil
Выход этого кода:
<p>hello, world</p>
p is being deinitialized
«р деинициализируется» печатается даже без [неопознанного я]
Код в руководстве:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
[unowned self] in
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 {
println("\(name) is being deinitialized")
}
}
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world")
println(paragraph!.asHTML)
paragraph = nil
Это печатает сообщение deinitialiser только тогда, когда добавлен оператор [unowned self].
В чем разница между обоими замыканиями?