我向Apple提交了一份关于此问题的错误报告,但我想确定我做的事情并不愚蠢。请考虑以下代码:
func coalesce(values: @autoclosure () -> Any?...) -> Any? {
for value in values {
if let found = value() {
return found
}
}
return nil
}
这懒惰地返回第一个非可选值。除了它不编译。编译器错误是:
protocol<>?
的值。你的意思是使用&#39;!&#39;或&#39;?&#39;?'protocol<>?'
当我第一次看到这个时,我认为我的语法很糟糕。但情节变浓了。如果以老式的方式迭代数组,一切正常!
func coalesce(values: @autoclosure () -> Any?...) -> Any? {
for v in 0..<values.count {
if let found = values[v]() {
return found
}
}
return nil
}
有人对此有任何见解吗?我的语法不正确吗?还有其他方法可以调用autoclosure吗?
答案 0 :(得分:2)
看来,问题在于迭代自动崩溃的值。也许编译器无法假设元素的正确类型。
我在这里找到了一个解决方法:
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
}