typealias CBType =() -> Void
class A {
let b = B()
func test() {
let token = b.register { CBType in
self.b.waitFor([token]) // ERROR: Variable used within its own initial value
}
b.dispatch()
}
}
class B {
private var _callbacks = [String:CBType]()
func register(callback: CBType) -> String {
let id = "1234"
_callbacks[id] = callback
return id
}
func dispatch() {
for (_, cb) in self._callbacks {
cb()
}
}
func waitFor(tokens: [String]) {
}
}
A().test()
Когда я изменяю тестовую функцию для использования переменной экземпляра, все работает снова, но этот синтаксис немного тяжелее.Переменная, используемая в пределах ее собственного начального значения, в то время как переменная используется в закрытии после инициализации
class A {
let b = B()
var token: String?
func test() {
token = b.register { CBType in
self.b.waitFor([self.token!])
}
b.dispatch()
}
}
Почему я не могу использовать локальную переменную в закрытии, так как она будет проходить мимо инициализации, когда окончательно вызывается замыкание?
Я понимаю это, но я до сих пор смущает тот факт, что закрытие только указатель функции: код функции не запускается до тех пор, пока не будет вызвано замыкание. Итак, почему компилятор настаивает на инициализации переменной, если одна и та же переменная не ссылается до тех пор, пока не будет выполнен код закрытия? – Laurent
компилятор выполняет свою работу :) нет возможного условия, при котором «токен» может быть успешно инициализирован, следовательно, ошибка re: ссылается на себя при установке его начального значения - я благодарен, что он достаточно умен, чтобы дать мне эти виды ошибок! – fqdn
@JohnDifool ваша догадка правильная. Здесь нет проблем, и это работает на других языках, таких как Haskell, и называется «связывание узла». Это быстрый дефицит. – user239558