在Swift中迭代一系列autoclosures会导致编译错误

时间:2014-11-19 00:32:12

标签: swift

我向Apple提交了一份关于此问题的错误报告,但我想确定我做的事情并不愚蠢。请考虑以下代码:

func coalesce(values: @autoclosure () -> Any?...) -> Any? {
    for value in values {
        if let found = value() {
            return found
        }
    }
    return nil
}

这懒惰地返回第一个非可选值。除了它不编译。编译器错误是:

  1. 未展开的可选类型protocol<>?的值。你的意思是使用&#39;!&#39;或&#39;?&#39;?
  2. 无效使用&#39;()&#39;调用非函数类型'protocol<>?'
  3. 的值

    当我第一次看到这个时,我认为我的语法很糟糕。但情节变浓了。如果以老式的方式迭代数组,一切正常!

    func coalesce(values: @autoclosure () -> Any?...) -> Any? {
        for v in 0..<values.count {
            if let found = values[v]() {
                return found
            }
        }
        return nil
    }
    

    有人对此有任何见解吗?我的语法不正确吗?还有其他方法可以调用autoclosure吗?

1 个答案:

答案 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
}