美文网首页
Swift 5.3 新特性

Swift 5.3 新特性

作者: 问问你是谁 | 来源:发表于2020-10-09 11:51 被阅读0次

    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 新特性

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