我就此向 Apple 提交了错误报告,但想确定我没有做傻事。考虑以下代码:
func coalesce(values: @autoclosure () -> Any?...) -> Any? {
for value in values {
if let found = value() {
return found
}
}
return nil
}
这会延迟返回第一个非可选值。除了它不编译。编译器错误是:
- 可选类型的值
protocol<>?
没有打开。您是想使用“!”吗?还是“?”? - 无效使用“()”来调用非功能类型的值
'protocol<>?'
当我第一次看到这个时,我认为我的语法很糟糕。但情节变厚了。如果您以老式方式迭代数组,一切正常!
func coalesce(values: @autoclosure () -> Any?...) -> Any? {
for v in 0..<values.count {
if let found = values[v]() {
return found
}
}
return nil
}
有人对此有任何见解吗?我的语法不正确吗?还有其他方法可以调用自动关闭吗?
最佳答案
看来,问题出在迭代自动关闭的值上。也许编译器无法假定元素的正确类型。
我在这里找到了解决方法:
func coalesce(values:@autoclosure () -> Any? ... ) -> Any? {
for value: () -> Any? in values {
if let found = value() {
return found
}
}
return nil
}
顺便说一句,我真的很惊讶我们可以这样做:
let foo: @autoclosure () -> Int = 42
foo()
所以,这也有效:
func coalesce(values:@autoclosure () -> Any? ... ) -> Any? {
for value: @autoclosure () -> Any? in values {
// ^^^^^^^^^^^^
if let found = value() {
return found
}
}
return nil
}
关于swift - 在 Swift 中迭代一个自动闭包数组会导致编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27006855/