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