代码之家  ›  专栏  ›  技术社区  ›  NikxDa

比较两个枚举变量,而不考虑其关联值

  •  2
  • NikxDa  · 技术社区  · 7 年前

    考虑这个枚举:

    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")
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   NikxDa    7 年前

    我认为没有本地人支持这一点。但您可以通过定义自定义操作符来实现它(最好使用协议,但也可以直接实现)。大概是这样的:

    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) 字符串(描述:self) CustromStringConvertible 协议(可更改)

        2
  •  1
  •   SPatel mash    7 年前

    确认一下 Equatable

    extension DataType: Equatable {
        static func == (lhs: DataType, rhs: DataType) -> Bool {
            switch (lhs, rhs) {
            case (.One, .Two), (.Two, .One):
                return false
            case (.One, .One), (.Two, .Two):
                return true
            }
        }
    }
    

    如果您不想实现 相等的

    extension DataType{
        func isSame(_ other: DataType) -> Bool {
            switch (self, other) {
            case (.One, .Two), (.Two, .One):
                return false
            case (.One, .One), (.Two, .Two):
                return true
            }
        }
    }
    

    使用:

    let isTypeEqual = DataType.One(value: 1).isSame(DataType.One(value: 2))
    print (isTypeEqual) // true
    
        3
  •  0
  •   Paul B    7 年前

    这对我很有用:

    enum DataType {
        case one (data: Int)
        case two (value: String)
    }
    
    protocol EnumTypeEquatable {
        static func sameType(lhs: Self, rhs: Self) -> Bool
    }
    
    extension DataType: EnumTypeEquatable {
        static func sameType(lhs: DataType, rhs: DataType) -> Bool {
            if let caseLhs = Mirror(reflecting: lhs).children.first?.label, let caseRhs = Mirror(reflecting: rhs).children.first?.label {
                return (caseLhs == caseRhs)
            } else { return false }
        }
    }
    
    let isTypeEqual = DataType.sameType(lhs: .one(data: 1), rhs: .one(data: 2))
    print (isTypeEqual) // true