gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:34:06 24 4
gpt4 key购买 nike

我刚刚将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com