我想获取swift枚举对象的关联值,有没有办法比下面的switch语句更短/更好?
enum Test {
case a(Int), b(Int), c(Int)
}
func printValue(_ t: Test) {
switch t {
case .a(let v), .b(let v), .c(let v): print("value \(v)")
}
}
答案 0 :(得分:3)
您从多个枚举中提取相关值的代码是最经济且易于阅读的,无需对其进行改进。
但是,无论enum
的情况如何,您希望提取相关值这一事实表明您没有正确使用关联值:而不是将值与每个案例相关联,应创建一个复合类型,其中包含Int
和enum
而没有关联值,即
enum Test {
case a, b, c
}
class MyClass {
var num : Int
var tst : Test
}
现在相关的值是"在外面"每个enum
元素,可以独立于案例进行访问,您也可以给它一个有意义的名称,这会增加程序的可读性。
答案 1 :(得分:-1)
您可能希望使用镜像类型 - 这不是更好的方法,但在某些情况下它可能会有所帮助:
enum Test {
case a(Int), b(Int), c(Int)
}
func printValue(_ t: Test) {
let mirror = Mirror(reflecting: t)
print(mirror.children.first?.value ?? "")
}
printValue(.a(15))
同样使用if / case这样的情况,如果你只需要从一个案例中提取价值,这是一个较短的方法,有时它会有所帮助:
if case .a(let val) = t {
print("value \(val)")
}
或者原始价值可能更适合您的情况:
enum Test: Int {
case a = 1
case b = 2
case c = 5
}
func printValue(_ t: Test) {
print("value \(t.rawValue)")
}
printValue(.a)