gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:58:02 25 4
gpt4 key购买 nike

更新到 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参数类型 '(() -> Int) -> ()'

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

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

但这只会导致语法错误。

任何人都可以向我解释为什么会发生这种情况以及我可以做些什么来解决这个问题吗?

最佳答案

在我看来像是一个错误。出于某种原因,编译器不喜欢语法:

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

但它确实喜欢:

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

这是相同的症状,但我不确定它是否与 the compiler rejecting the [TypeA.TypeB]() syntax with nested types 的原因相同.虽然像那个问题,另一种解决方法是使用 typealias:

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

private var functionHandlers = [F]()

然后您可以实现 doRegister(),因为您正确地尝试将其实现为:

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

虽然你当然应该file a bug report [(@escaping () -> Int) -> ()]() 未编译。

关于swift - 更新到 Swift 3 后奇怪的转义函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40599881/

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