更新到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]()
使用嵌套类型的语法的原因相同。尽管类似该问题,但解决该问题的另一种方法是使用typealias
:
typealias F = (@escaping () -> Int) -> ()
private var functionHandlers = [F]()
然后,您可以doRegister()
按照正确尝试将其实施为的方式实施:
func doRegister() {
functionHandlers.append { (f: @escaping () -> Int) in
myFunction = f
}
}
虽然你当然应该提交bug报告在[(@escaping () -> Int) -> ()]()
没有编制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句