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
}
- 对于有 RawValue 的枚举,我们需要重写
<
方法,对它们的 RawValue 进行比较实现
enum Membership: Int, Comparable {
case premium
case preferred
case general
static func < (lhs: Self, rhs: Self) -> Bool {
return lhs.rawValue < rhs.rawValue
}
}
- 对于没有 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))
}
}
- 或者可能通过添加私有编号
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]