swift - 在 Swift 中迭代一个自动闭包数组会导致编译错误

标签 swift

我就此向 Apple 提交了错误报告,但想确定我没有做傻事。考虑以下代码:

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

这会延迟返回第一个非可选值。除了它不编译。编译器错误是:

  1. 可选类型的值protocol<>?没有打开。您是想使用“!”吗?还是“?”?
  2. 无效使用“()”来调用非功能类型的值 '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/

相关文章:

ios - 应用程序在 iPhone 6s 的 'peek and pop' 实现中卡住

ios - 禁用 iPhone X 约束

ios - 带有太长阿拉伯文本的 CoreText

ios - 从 JSON 获取对象

json - 无法从 json 数据中提取值

swift - 在 SWIFT 中的 xib 文件上呈现 ViewController

c++ - OpenCV从2D像素获取3D坐标

swift - 在 for-in 循环中使用字符串宽度的问题

arrays - 展平 [Any] 数组 Swift

ios - 如何在 iOS 上的 Office 中打开本地文件