在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。我看不出编译器无法正确推断值的原因。其中“正确推断值”的意思是“正确推断类型”