gpt4 book ai didi

swift - 从枚举中获取关联值,无需 switch/case

转载 作者:行者123 更新时间:2023-11-30 13:35:12 26 4
gpt4 key购买 nike

我有一个枚举,其中包含一些不同类型的不同案例,例如

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com