Swift

Swift 5.3 - SE-0266 - Synthesize

2020-12-11  本文已影响0人  ienos

新特性: 对于 Enum 类型, 遵循 Comparable 协议的自动实现 < 协议方法


假设在枚举的声明中,我们有明确的语义上的排序,但是实际比较中,我们需要自己实现具体的比较方法

enum Membership {
    case premium // <
    case preferred // <
    case general
}

enum Brightness {
    case low // <
    case medium // <
    case high
}
  1. 对于有 RawValue 的枚举,我们需要重写 < 方法,对它们的 RawValue 进行比较实现
enum Membership: Int, Comparable {
    case premium   
    case preferred
    case general

    static func < (lhs: Self, rhs: Self) -> Bool {
        return lhs.rawValue < rhs.rawValue
    }

}
  1. 对于没有 RawValue 的枚举(这种写法可读性不高),定一个私有的 minimum 方法,然后进行枚举之间的比较
enum Brightness: Comparable {
    case low
    case medium
    case high

    private static func minimum(_ lhs: Self, _ rhs: Self) -> Self {
        switch (lhs, rhs) {
        case (.low, _), (_, .low):
            return .low
        case (.medium, _), (_, .medium):
            return .medium
        case (.high, _), (_, .high):
            return .high
        }
    }

    static func < (lhs: Self, rhs: Self) -> Bool {
        return (lhs != rhs) && (lhs == Self.minimum(lhs, rhs))
    }

}
  1. 或者可能通过添加私有编号 comparisonValue 进行排序
enum Membership: Comparable {
    case premium
    case preferred
    case general

    private var comparisonValue: Int {
        switch self {
            case .premium:
                return 0
            case .preferred:
                return 1
            case .general:
                return 2
        }
    }

    static func < (lhs: Self, rhs: Self) -> Bool {
        return lhs.comparisonValue < rhs.comparisonValue
    }

}

在该特性中,遵循 Comparable 协议的枚举已自动实现 < 方法;先判断 case 的声明顺序, 再判断关联值进行比较

注: 具有 RawValue,或者已实现 < 方法, 关联值没有遵循 Comparable 的枚举不会自动生成 < 的实现

enum Membership: Comparable {
    case premium(Int)
    case preferred
    case general
}

([.preferred, .premium(1), .general, .premium(0)] as [Membership]).sorted()
// [Membership.premium(0), Membership.premium(1), Membership.preferred, Membership.general]
上一篇下一篇

猜你喜欢

热点阅读