xcode - Swift @autoclosure 打破了 v1.2 中枚举案例的兼容性

标签 xcode swift

我刚刚将 Xcode 更新到 6.3,以前在 Xcode 6.2 中编译的 Swift 代码现在无法编译。

import Foundation

public enum Result<T> {
    case Success(@autoclosure() -> T)
    case Failure(NSError)
    case Cancelled

    public init(_ value: T) {
        self = .Success(value)
    }

    public init(_ error: NSError) {
        self = .Failure(error)
    }

    public init() {
        self = .Cancelled
    }

    public var failed: Bool {
        switch self {
        case .Failure(let error):
            return true

        default:
            return false
        }
    }

    public var error: NSError? {
        switch self {
        case .Failure(let error):
            return error

        default:
            return nil
        }
    }

    public var value: T? {
        switch self {
        case .Success(let value):
            return value()

        default:
            return nil
        }
    }
}

这一行: 案例成功(@autoclosure() -> T)

产生错误:'autoclosure' 属性只允许在参数上使用,而不能在枚举情况下使用

只是删除 @autoclosure 并不能解决问题。

最佳答案

正确。这已被删除,明确地防止您提供的案例。自动闭包不打算以这种方式使用,Swift 团队有意取消了这样做的能力。在 Result 类型中,这是很危险的,因为每次访问闭包时都会重新求值。如果闭包中有副作用,这可能会产生非常令人惊讶的影响。即使它很重要,它也会产生令人惊讶的性能影响。

此处正确的工具是 Box。参见 Rob Rix 的 Result对于这种类型的良好实现。

关于xcode - Swift @autoclosure 打破了 v1.2 中枚举案例的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29539812/

相关文章:

swift - 我可以在 API 的后端使用 Swift 吗?

swift - 防止访问不存在的元素导致测试失败

在按钮点击时快速添加自定义单元格

objective-c - CloudKit ___recordID 未标记为可查询

ios - Alamofire - Swift 编译器错误 - 使用未声明的类型

ios - Xcode 将 Command+click 更改为 Control+click

swift - 在 Swift 中初始化可选的 UIActivityIndi​​catorView

ios - 新 iOS 项目模板中的 Xcode Storyboard

ios - Appledoc 和自定义链接说明

ios - 如何使用应用程序端的 strip 更新保存的信用卡信息(swift)