更新到 Swift 3 后奇怪的转义函数行为

2024-02-05

更新到 Swift 3 后,我在执行以下代码行时遇到困难:

private var functionHandlers = [(() -> Int) -> ()]()

private var myFunction: (() -> Int)?

func doRegister() {
    functionHandlers.append { (f: (() -> Int)) in
        myFunction = f
    }
}

这给了我编译器错误:Assigning non-escaping parameter 'f' to an escaping closure

然后,我尝试了这个:

func doRegister() {
    functionHandlers.append { (f: @escaping (() -> Int)) in
        myFunction = f
    }
}

和这个:

func doRegister() {
    functionHandlers.append { (f: (@escaping () -> Int)) in
        myFunction = f
    }
}

在这两种情况下,修复了我的第一个错误,但随后又给了我一个新的编译器错误:Cannot convert value of type '(@escaping (() -> Int)) -> ()' to expected argument type '(() -> Int) -> ()'

然后我尝试改变类型functionHandlers如下:

private var functionHandlers = [(@escaping (() -> Int)) -> ()]()

但这只会导致语法错误。

谁能向我解释为什么会发生这种情况以及我能做些什么来解决这个问题?


对我来说看起来像一个错误。由于某种原因,编译器不喜欢以下语法:

private var functionHandlers = [(@escaping () -> Int) -> ()]()

但它确实喜欢:

private var functionHandlers : [(@escaping () -> Int) -> ()] = []

症状相同,但不确定原因相同编译器拒绝[TypeA.TypeB]()嵌套类型的语法 https://stackoverflow.com/questions/25682113/why-cant-i-instantiate-an-empty-array-of-a-nested-class。尽管像这个问题一样,解决它的另一种方法是使用typealias:

typealias F = (@escaping () -> Int) -> ()

private var functionHandlers = [F]()

然后你可以实施doRegister()正如您正确尝试将其实现为:

func doRegister() {
    functionHandlers.append { (f: @escaping () -> Int) in
        myFunction = f
    }
}

虽然你当然应该提交错误报告 https://bugs.swift.org over [(@escaping () -> Int) -> ()]()不编译。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新到 Swift 3 后奇怪的转义函数行为 的相关文章

随机推荐