我有一些不同类型的枚举,例如
enum X {
case AsInt(Int)
case AsDouble(Double)
}
我可以switch
就这些问题做好准备就可以恢复基础价值。但是,switch
语句非常烦人,试图让我为其他我不关心的案例执行一些代码。例如,现在我有类似
func AsInt(x: X) -> Int? {
switch x {
case AsInt(let num):
return num;
default:
return nil;
}
}
这样可行,但总是必须引用此方法并且必须为每个枚举的每个案例编写一个新方法,这非常繁琐。我正在寻找的是如何简单地尝试将X
类型的值转换为其中一个案例,例如
var object: X = func();
let value = obj as? Int;
if value {
// do shit
}
我怎样才能简单地检查一个案例而不必枚举我不关心的所有案例并为他们执行一些非陈述?
可以将value
声明为条件的一部分而不是污染范围的任何解决方案的加分点。
答案 0 :(得分:11)
实际上有多种方法可以做到。
让我们通过使用计算属性扩展你的枚举来实现它:
enum X {
case asInt(Int)
case asDouble(Double)
var asInt: Int? {
// ... see below
}
}
if case
让let
在外:
var asInt: Int? {
if case let .asInt(value) = self {
return value
}
return nil
}
内置let
:
var asInt: Int? {
if case .asInt(let value) = self {
return value
}
return nil
}
guard case
让let
在外:
var asInt: Int? {
guard case let .asInt(value) = self else {
return nil
}
return value
}
内置let
:
var asInt: Int? {
guard case .asInt(let value) = self else {
return nil
}
return value
}
最后一个是我个人最喜欢的四种解决方案的语法。
答案 1 :(得分:7)
从Swift 2(Xcode 7)开始,这可以通过if/case
和。{
模式匹配:
let x : X = ...
if case let .AsInt(num) = x {
print(num)
}
num
的范围仅限于if语句。