Swift 5.3 新特性

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
}

相比之前明显简洁了很多。

不过,这样做还有些前提:

  1. 你的枚举类型不能有raw values;
  2. 你的枚举类型如果有关联值的话,也必须要递归遵守Comparable协议;
  3. 如果你显式地实现了"<"运算符,则其排序仍按“<”中的逻辑。

最后看下代码示例:

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开始,在两种情况下你可以不用这么做了。

  1. 你已经在逃逸闭包的捕获列表中捕获了self,比如这样:
class Test {
    var x = 0
    func execute(_ work: @escaping () -> Void) {
        work()
    }
    func method() {
        execute { [self] in
            // 里面的self.都可以省略了
            x += 1
        }
    }
}
  1. 当self不是引用类型,而是值类型,因为值类型实际不会有循环引用的问题,所以也不需要显式的写self.了:
struct Test {
    var x = 0
    func execute(_ work: @escaping () -> Void) {
        work()
    }
    func method() {
        execute { 
            x += 1
        }
    }
}

未完待续。

你可能感兴趣的:(Swift 5.3 新特性)