I have several different enums in my project, that conform to the same protocol. The compareEnumType
method from the protocol compares enum cases ignoring associated values. Here is my code from 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"
}
In my real project I have more than 2 enums, and for each of them I have to have similar implementation of compareEnumType
function.
The question is: is it possible to have a generic implementation of compareEnumType
which would work for all enums conforming to EquatableEnumType
protocol?
I tried to write a default implementation in protocol extension like this:
extension EquatableEnumType {
static func compareEnumType(lhs: Self, rhs: Self) -> Bool {
// how to implement???
}
}
But I'm stuck with implementation. I don't see a way to access a value contained in lhs
and rhs
. Could anyone help me?
Easy! I would use an instance method, but you can rewrite it to a class function, if you really need it to be static.
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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With