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

标签 swift swift2

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/

相关文章:

ios - 如何在 swift 中将 NSIndexPath 添加到 NSUserDefaults

arrays - 如何快速比较变量 String() 和字符串?

swift - 为什么我可以用泛型在 swift 中提出相同类型的要求?有什么办法吗?

objective-c - 以编程方式唤醒 OSX 上的显示

ios - UIButton 在 NavigationController 中没有响应

ios - 如何在 Swift 3 中将数据转换为 Int?

ios - Swift iOS 8.1 中的 UUID

ios - ReactiveCocoa 4 : Observing an Action's completed event

swift - 推送远程通知

swift - Swift 2.0 中的 motionEnded 方法