加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

比较忽略关联值的Swift Enum类型 – 通用实现

发布时间:2020-12-14 04:55:04 所属栏目:百科 来源:网络整理
导读:我的项目中有几个不同的枚举,符合相同的协议.协议中的compareEnumType方法比较忽略关联值的枚举情况.这是我在游乐场的代码: protocol EquatableEnumType { static func compareEnumType(lhs: Self,rhs: Self) - Bool}enum MyEnum: EquatableEnumType { case
我的项目中有几个不同的枚举,符合相同的协议.协议中的compareEnumType方法比较忽略关联值的枚举情况.这是我在游乐场的代码:

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"
}

在我的真实项目中,我有两个以上的枚举,对于每个枚举,我必须有compareEnumType函数的类似实现.

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

我尝试在协议扩展中编写一个默认实现,如下所示:

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

但我坚持实施.我没有看到访问lhs和rhs中包含的值的方法.谁能帮助我?

解决方法

我不认为你可以自动生成这个,所以这是一种使用扩展的方式.我建议创建一个新的枚举CompareEnumMethod,它告诉您是要比较关联的值还是仅比较类型.在您的协议中创建一个新函数compareEnum,该函数将此枚举作为参数.然后,您可以为==(lhs:,rhs :)创建一个扩展名,并说它使用.value,而对于compareEnumType,则使用.type.现在只需要在每个枚举中实现compareEnum方法.

enum CompareEnumMethod {
    case type,value
}

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

extension EquatableEnumType {
    static func compareEnumType(lhs: Self,rhs: Self) -> Bool {
        return Self.compareEnum(lhs: lhs,rhs: rhs,method: .type)
    }

    static func ==(lhs: Self,method: .value)
    }
}

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

    static func compareEnum(lhs: MyEnum,rhs: MyEnum,method: CompareEnumMethod) -> Bool {
        switch (lhs,rhs,method) {
        case let (.A(lhsA),.A(rhsA),.value):
            return lhsA == rhsA
        case (.A,.A,.type),(.B,.B,_):
            return true
        default:
            return false
        }
    }
}

let a0 = MyEnum.A(5)
let a1 = MyEnum.A(3)
let b0 = MyEnum.B
print(MyEnum.compareEnumType(lhs: a0,rhs: a1)) //true
print(a0 == a1) //false
print(MyEnum.compareEnumType(lhs: a0,rhs: b0)) //false

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读