我正在使用Result实现结果对象,它定义了一个盒装结果,例如带有enum
的Optional:
public enum Result<T, Error>: Printable, DebugPrintable {
case Success(Box<T>)
case Failure(Box<Error>)
...
}
为Equatable
定义的Result
协议如下:
public func == <T: Equatable, Error: Equatable> (left: Result<T, Error>, right: Result<T, Error>) -> Bool
因此,T
必须符合Equatable
。
我希望能够Success
设置Void
类似的方框。但是,Void
不是Equatable
,因为它被定义为空元组:
typealias Void = ()
目的是能够拥有Result
类型,在成功时我不关心值。
是否可以拥有Equatable
Void
(或没有价值)?
快速思考,有可能创建一个空的struct
,但我正在寻找(如果可能的话)更优雅的解决方案。
答案 0 :(得分:1)
在Swift 2.0中再次尝试,似乎Void可以初始化为Void()
:
public enum Result<T, Error: ErrorType> {
case Success(T)
case Failure(Error)
var value: T? {
switch self {
case .Success(let v):
return v
case .Failure(_):
return nil
}
}
/// Constructs a success wrapping a `value`.
public init(value: T) {
self = .Success(value)
}
/// Constructs a failure wrapping an `error`.
public init(error: Error) {
self = .Failure(error)
}
}
enum MyError: ErrorType {
case AnError
}
let result = Result<Void, MyError>(value: Void())
let success = result.value != nil // returns true
let error = result.value == nil // returns false
答案 1 :(得分:0)
为什么不让Success包含一个Optional? (Box<T?>
或Box<t>?
)?
你可以返回零。不利的一面是你要打开你的结果