gpt4 book ai didi

swift - 比较忽略关联值的 Swift 枚举类型 - 通用实现

转载 作者:搜寻专家 更新时间:2023-10-31 08:07:41 26 4
gpt4 key购买 nike

我的项目中有几个不同的枚举,它们符合相同的协议(protocol)。协议(protocol)中的 compareEnumType 方法会比较忽略关联值的枚举案例。这是我在 Playground 上的代码:

protocol EquatableEnumType {
static func compareEnumType(lhs: Self, rhs: Self) -> Bool
}

enum MyEnum: EquatableEnumType {
case A(Int)
case B

static func compareEnumType(lhs: MyEnum, rhs: MyEnum) -> Bool {
switch (lhs, rhs) {
case (.A, .A): return true
case (.B, .B): return true
default: return false
}
}
}

enum MyEnum2: EquatableEnumType {
case X(String)
case Y

static func compareEnumType(lhs: MyEnum2, rhs: MyEnum2) -> Bool {
switch (lhs, rhs) {
case (.X, .X): return true
case (.Y, .Y): return true
default: return false
}
}
}

let a = MyEnum.A(5)
let a1 = MyEnum.A(3)
if MyEnum.compareEnumType(lhs: a, rhs: a1) {
print("equal") // -> true, prints "equal"
}

let x = MyEnum2.X("table")
let x1 = MyEnum2.X("chair")
if MyEnum2.compareEnumType(lhs: x, rhs: x1) {
print("equal2") // -> true, prints "equal2"
}

在我的实际项目中,我有 2 个以上的枚举,对于每个枚举,我都必须有类似的 compareEnumType 函数实现。

问题是:是否有可能实现 compareEnumType 的通用实现,它适用于所有符合 EquatableEnumType 协议(protocol)的枚举?

我试过像这样在协议(protocol)扩展中编写一个默认实现:

extension EquatableEnumType {
static func compareEnumType(lhs: Self, rhs: Self) -> Bool {
// how to implement???
}
}

但我坚持实现。我没有找到访问 lhsrhs 中包含的值的方法。谁能帮帮我?

最佳答案

简单!我会使用实例方法,但如果您真的需要它是静态的,您可以将它重写为类函数。

extension EquatableEnumCase {
func isSameCase(as other: Self) -> Bool {
let mirrorSelf = Mirror(reflecting: self)
let mirrorOther = Mirror(reflecting: other)
if let caseSelf = mirrorSelf.children.first?.label, let caseOther = mirrorOther.children.first?.label {
return (caseSelf == caseOther) //Avoid nil comparation, because (nil == nil) returns true
} else { return false}
}
}


enum MyEnum1: EquatableEnumCase {
case A(Int)
case B
}

enum MyEnum2: EquatableEnumCase {
case X(String)
case Y
}

let a = MyEnum1.A(5)
let a1 = MyEnum1.A(3)
if a.isSameCase(as: a1) {
print("equal") // -> true, prints "equal1"
}

let x = MyEnum2.X("table")
let x1 = MyEnum2.X("chair")

if x.isSameCase(as: x1) {
print("equal2") // -> true, prints "equal2"
}

let y = MyEnum2.Y
print(x.isSameCase(as: y) ? "equal3": "not equal3") // -> false, "not equal3"

关于swift - 比较忽略关联值的 Swift 枚举类型 - 通用实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47597489/

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