美文网首页Swift
Swift 5.3 - SE-0266 - Synthesize

Swift 5.3 - SE-0266 - Synthesize

作者: ienos | 来源:发表于2020-12-11 15:41 被阅读0次

    新特性: 对于 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]
    

    相关文章

      网友评论

        本文标题:Swift 5.3 - SE-0266 - Synthesize

        本文链接:https://www.haomeiwen.com/subject/avbjgktx.html