gpt4 book ai didi

swift - 变量在其自己的初始值内使用,而变量在 init 之后的闭包内使用

转载 作者:搜寻专家 更新时间:2023-11-01 05:49:03 24 4
gpt4 key购买 nike

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()
}
}

为什么我不能在闭包中使用局部变量,因为当闭包最终被调用时它已经过了初始化阶段?

最佳答案

常量 token 在被闭包捕获时没有值。

您可以改用可变变量,闭包将捕获变量而不是其值。

func test() {
var token = ""
token = b.register {
self.b.waitFor([token])
}

b.dispatch()
}

或者,您可以将 token 作为参数传递到闭包中:

typealias CBType = (String) -> Void

class A {
let b = B()

func test() {
let token = b.register { theToken in
self.b.waitFor([theToken])
}

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 (id, cb) in self._callbacks {
cb(id)
}
}

func waitFor(tokens: [String]) {
println("Wait for \(tokens)")
}
}

A().test()

关于swift - 变量在其自己的初始值内使用,而变量在 init 之后的闭包内使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31373153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com