Ответ 1
Это выглядит интересно, поэтому я копаю немного глубже. Обнаружил, что вы можете получить доступ к переменным экземпляра класса внутри замыкания, как self.instanceVariable
. Тогда закрытие захватит self
внутри него. Так что теперь self
относится к самому экземпляру класса. Ваше закрытие должно быть ленивой собственностью.
Свойство lazy означает, что вы можете ссылаться на self в закрытии по умолчанию, потому что свойство lazy не будет доступно до тех пор, пока не будет завершена инициализация и известно, что self существует.
Вам не хватает @lazy, так что self
неизвестно закрытию, поэтому он печатает его как (Function)
, я думаю.
class TableViewController: UIViewController {
var name = "anil"
// Since swift 2.0 came out @lazy is replaced by lazy
lazy var c1: () -> () = {
println(self)
println(self.name)
}
var c2: () -> () {
get {
return { println(self) }
}
}
var c3: () -> () {
return { println(self) }
}
override func viewDidLoad() {
super.viewDidLoad()
c1()
c2()
c3()
}
}
Выход
<_ttc12tableviewapp19tableviewcontroller: 0x10d54e000>
anil
<_ttc12tableviewapp19tableviewcontroller: 0x10d54e000> <_ttc12tableviewapp19tableviewcontroller: 0x10d54e000>
Обновление
Назначение замыкания переменной экземпляра класса приводит к сильному циклу ссылок. Вам следует избегать этого. Swift использует список захвата для этого
Если вы назначаете замыкание свойству экземпляра класса, и замыкание захватывает этот экземпляр, ссылаясь на экземпляр или его члены, вы создадите сильный ссылочный цикл между замыканием и экземпляром. Swift использует списки захвата, чтобы разорвать эти сильные циклы ссылок. Для получения дополнительной информации см. Циклы сильных ссылок для замыканий.
Таким образом, правильное использование замыкания может быть
@lazy var c1: () -> () = {
[unowned self] in
println(self)
println(self.name)
}
Справка: Руководство по программированию Swift
Изменить
@lazy был изменен на ленивый