我在项目中有几个不同的枚举类型,它们符合同一协议。该协议中的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
协议的所有枚举类型?我尝试在协议扩展中编写默认实现,如下所示:
extension EquatableEnumType {
static func compareEnumType(lhs: Self, rhs: Self) -> Bool {
// how to implement???
}
}
但是我在实现过程中卡住了。我不知道如何访问lhs
和rhs
中包含的值。有人能帮帮我吗?
Equatable
的意义,它“暗示了可互换性 - 任何比较相等的两个实例都可以在依赖于它们的值的任何代码中互换使用。为了保持可互换性,== 运算符应该考虑 Equatable 类型的所有可见方面。不鼓励公开 Equatable 类型的非值方面,除了类身份之外的任何非值方面应该在文档中明确指出。” 这是一个非常糟糕的主意,你应该重新设计你的类型以避免它。如果你下决心要做这个,你需要的工具是 SwiftGen。 - Rob Napier