作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个枚举,其中包含一些不同类型的不同案例,例如
enum X {
case AsInt(Int)
case AsDouble(Double)
}
我可以切换
这些来很好地获取潜在的值(value)。然而, 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
声明为条件的一部分而不是污染范围的解决方案都会获得奖励点。
最佳答案
实际上有多种方法可以做到这一点。
让我们通过使用计算属性扩展枚举来实现这一点:
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
}
防护罩
的解决方案通过将 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
}
最后一种是四种解决方案中我个人最喜欢的语法。
关于swift - 从枚举中获取关联值,无需 switch/case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36161360/
我是一名优秀的程序员,十分优秀!