在Swift中迭代自动关闭数组会导致编译错误
我向苹果提交了一份关于这个问题的错误报告,但我想确定我没有做什么愚蠢的事情。考虑下面的代码:在Swift中迭代自动关闭数组会导致编译错误,swift,Swift,我向苹果提交了一份关于这个问题的错误报告,但我想确定我没有做什么愚蠢的事情。考虑下面的代码: func coalesce(values: @autoclosure () -> Any?...) -> Any? { for value in values { if let found = value() { return found } } return nil } 这将延迟返回第一个非可选值。除了它不编
func coalesce(values: @autoclosure () -> Any?...) -> Any? {
for value in values {
if let found = value() {
return found
}
}
return nil
}
这将延迟返回第一个非可选值。除了它不编译。编译器错误包括:
协议?
未展开。你想用“!”吗还是“?”“protocol?”
func coalesce(values: @autoclosure () -> Any?...) -> Any? {
for v in 0..<values.count {
if let found = values[v]() {
return found
}
}
return nil
}
func coalesce(值:@autoclosure()->Any?..)->Any?{
对于0..中的v,问题似乎在于迭代自动关闭的值。可能编译器无法假定正确的元素类型
我在这里找到了一个解决方法:
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
}
我已经将其标记为正确,但我仍然认为这是一个bug。我看不出编译器无法正确推断值的原因。其中“正确推断值”的意思是“正确推断类型”