【发布时间】:2015-10-03 00:48:35
【问题描述】:
在 Swift 2 之前,我经常使用带有关联值的枚举并添加函数来提取特定值,如下所示:
public enum Maybe <T> {
case Unknown
case Known(T)
public var value: T? {
switch self {
case .Unknown: return nil
case .Known(let value): return value
}
}
}
这将允许我做这样的事情:
let maybe = .Known("Value")
let val = maybe.value ?? "Another Value"
我想摆脱这些方便的函数并依赖 Swift 2 的新语法。可以这样做:
let val: String
if case .Known(let value) = maybe {
val = value
} else {
val = "Another Value"
}
但我不知道如何使用 ?? 运算符甚至三元运算符将其压缩回一行。
这甚至可能吗,还是我坚持在枚举上定义“提取”选项?
更新(澄清)
Maybe 枚举只是一个示例,但该解决方案需要适用于具有多个关联值的枚举...例如 Either:
public enum Either<L, R> {
case Left(Box<L>)
case Right(Box<R>)
public func left() -> L?{
switch self {
case let Left(value):
return value.value
default:
return nil
}
}
public func right() -> R?{
switch self {
case let Right(value):
return value.value
default:
return nil
}
}
}
我正在寻找的语法类似于:
let val = (case .Known(let value) = maybe) ?? "AnotherValue"
我想要做的是轻松提取特定案例的关联值,否则提供默认值。
对于Either,它可能类似于:
let val = (case .Left(let value) = either) ?? "AnotherValue"
有意义吗?
【问题讨论】:
-
你为什么要声明自己的
Maybe类型呢?这正是Optionals 的用途! -
其实不是。它不符合
NilLiteralConvertable。如果您想明确说明某个值的缺失或提供有关缺失原因的更多信息,则可以使用类似的方法。 -
你想用什么语法来处理这个
Either?也许您想给出您要解决的实际示例(因为Either也得到了很好的探索:github.com/robrix/Either)。基本上:你想编译什么今天没有编译?