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

时间:2015-07-12 22:22:29

标签: 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()
    }
}

为什么我不能在闭包中使用局部变量,因为在最终调用闭包时它会超过初始化?

2 个答案:

答案 0 :(得分:9)

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

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

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

    b.dispatch()
}

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

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

答案 1 :(得分:0)

在您的第一个示例中,token在您拨打电话self.b.waitFor([token])时没有值。

在您的第二个示例中,一切似乎都有效,因为通过声明token如此:var token: String?会给出一个初始值(nil)。

问题不在于您是使用实例变量-vs-一个局部变量(或者它是否在闭包中使用),问题在于(在第一个示例中)您是尝试在提供初始值的表达式中使用token

相当于这将声明Int如此:let myValue: Int = myValue + 1 - 它的初始值应该是"什么" + 1?