gpt4 book ai didi

swift - 比较两个枚举变量而不考虑它们的关联值

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:58 25 4
gpt4 key购买 nike

考虑这个枚举:

enum DataType {
case One (data: Int)
case Two (value: String)
}

Swift 有模式匹配来比较枚举和相关值,像这样:

let var1 = DataType.One(data: 123)
let var2 = DataType.One(data: 456)

if case DataType.One(data: _) = var2 {
print ("var2 is DataType.One")
}

如果不比较一个变量与枚举类型,而是比较两个变量的枚举类型,怎么办?我看到了一大堆类似的问题,但没有一个关注你的情况两个变量。

我基本上想要的是:

if case var1 = var2 {
print ("var1 is the same enum type as var2")
}

最佳答案

更新方法:

我认为对此没有原生支持。但是您可以通过定义自定义运算符来实现它(最好使用协议(protocol),但您也可以直接这样做)。像这样:

protocol EnumTypeEquatable {
static func ~=(lhs: Self, rhs: Self) -> Bool
}

extension DataType: EnumTypeEquatable {
static func ~=(lhs: DataType, rhs: DataType) -> Bool {
switch (lhs, rhs) {
case (.one, .one),
(.two, .two):
return true
default:
return false
}
}
}

然后像这样使用它:

let isTypeEqual = DataType.One(value: 1) ~= DataType.One(value: 2)
print (isTypeEqual) // true



旧方法:

protocol EnumTypeEquatable {
var enumCaseIdentifier: String { get }
}

extension DataType: EnumTypeEquatable {
var enumCaseIdentifier: String {
switch self {
case .one: return "ONE"
case .two: return "TWO"
}
}
}

func ~=<T>(lhs: T, rhs: T) -> Bool where T: EnumTypeEquatable {
return lhs.enumCaseIdentifier == rhs.enumCaseIdentifier
}

旧版本取决于运行时,可能会提供默认的 enumCaseIdentifier 实现,具体取决于 String(describing: self),这是不推荐的。 (因为 String(describing: self) 使用 CustromStringConvertible 协议(protocol)并且可以改变)

关于swift - 比较两个枚举变量而不考虑它们的关联值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54402685/

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