Swift 5.3已经于9月16日正式release了。其中有一些很重要的新特性这里简单列举下。全部内容请看官网。
一、枚举类型可直接遵守Comparable协议实现cases的字典序比较
如下这个枚举,3个cases代表的等级有由高到低的顺序。
enum Membership {
case premium
case preferred
case general
}
在以前,如果我们想比较两个cases,需要遵循Comparable协议,并实现“<”运算符。实现起来就像这样:
enum Membership: Int, Comparable {
case premium
case preferred
case general
static func < (lhs: Self, rhs: Self) -> Bool {
return lhs.rawValue < rhs.rawValue
}
}
或这样:
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
}
}
Swift 5.3以后我们这样写就可以了:
enum Membership: Comparable {
case premium
case preferred
case general
}
相比之前明显简洁了很多。
不过,这样做还有些前提:
- 你的枚举类型不能有raw values;
- 你的枚举类型如果有关联值的话,也必须要递归遵守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]
二、逃逸闭包中隐式"self"的使用
在Swift 5.3以前,为了防止无意中写出循环引用,我们必须在所有的逃逸闭包中显式的使用self.xx(xx值属性),否则编译器会报错:
error: reference to property 'xx' in closure requires explicit 'self.' to make capture semantics explicit
而从Swift 5.3开始,在两种情况下你可以不用这么做了。
- 你已经在逃逸闭包的捕获列表中捕获了self,比如这样:
class Test {
var x = 0
func execute(_ work: @escaping () -> Void) {
work()
}
func method() {
execute { [self] in
// 里面的self.都可以省略了
x += 1
}
}
}
- 当self不是引用类型,而是值类型,因为值类型实际不会有循环引用的问题,所以也不需要显式的写self.了:
struct Test {
var x = 0
func execute(_ work: @escaping () -> Void) {
work()
}
func method() {
execute {
x += 1
}
}
}
未完待续。