Swift 5 新特性

作者: uniapp | 来源:发表于2020-04-06 12:18 被阅读0次

    2019 年,苹果公布了新的 Swift5, 在开发官网明确提出了 Swift5 新增的 5 大功能],包括:

    1 字符串采用 UTF-8 编码重新实施,这通常可以加快代码运行速度
    2 默认情况下,独占访问内存功能在调试和发布版本上强制执行
    3 标准资料库中的 SIMD Vector 和 Result 类型
    4 Dictionary 和 Set 的性能得到了提升
    5 支持可动态调用的类型,改善了与动态语言 (如 Python、JavaScript 和 Ruby) 的互操作性

    对特性2 的理解:独占访问功能保证了数据操作的安全性,在调试版本上开启,保证运行时的一致;
    对特性3 的理解:添加了新协议AdditiveArithmetic,提交Vector类型的运行效率;添加了枚举 Result,使用关联值接收返回数据,可以用在网络请求中;
    其他 3 个特性,可以通过以下代码理解:

    特性1
    //MARK: 1 字符串采用 UTF-8 编码重新实施,这通常可以加快代码运行速度
    func line_cal1() {
        //MARK: / 的处理
        let str_line = #"Sam: "How do U do?""#
        print(str_line)
        //Sam: "How do U do?"
        //MARK: # 的处理
        let str_line_2 = ##"Sam: "How do U do?" I use #swift"##
        print(str_line_2)
        //Sam: "How do U do?" I use #swift
        
        //MARK: 使用正则
        let mathch1 = #"[0-9]\s[0-9]"#
        let regular = try! NSRegularExpression(pattern: mathch1, options: .allowCommentsAndWhitespace)
        let str = "123 256 345 789"
        
        let res = regular.matches(in: str, options: .withoutAnchoringBounds, range: NSRange(location: 0, length: str.count))
        res.forEach { (res) in
            let start = str.index(str.startIndex, offsetBy: res.range.location)
            let end = str.index(start, offsetBy: res.range.length)
            let subStr = str[start..<end]
            print(subStr)
            /**
             3 2
             6 3
             5 7
             */
        }
    }
    
    特性4
    //MARK: 4 处理字典值,组成新字典,并且去掉不符合条件item
    func map_dic() {
        let a = ["a":"2", "b":"1", "c":"c"]
        let res = a.compactMapValues({Int($0)})
        //["a": 2, "b": 1]
    }
    
    特性5
    //MARK: 5 dynamicCallable 一级对象默认接口
    func dyna() {
        struct RandomGenerato {
            func generate(powerNum: Int) -> Double {
                let max = pow(10, Double(powerNum))
                return Double.random(in: 0...max)
            }
        }
    
        @dynamicCallable
        struct RandomGenerato2 {
            func dynamicallyCall(withArguments args:[Int]) -> Double {
                print(args)
                let powerNum = Double(args.first ?? 0)
                let max = pow(10, Double(powerNum))
                return Double.random(in: 0...max)
            }
        }
    
        @dynamicCallable
        struct RandomGenerato3 {
            func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, String>){
                for (key, value) in withKeywordArguments {
                    print("\(key) --- \(value)")
                }
            }
        }
    
        let generator2 = RandomGenerato2()
        let res = generator2(1,2,3)
        print(res)
        let generator3 = RandomGenerato3()
        generator3(name:"zhangsan")
    }
    
    Swift5 中其他新增功能
    //MARK: 1 是否是某个数的整数倍
    func num_1() {
        let num1 = 4
        if num1.isMultiple(of: 1) {
            print("even")
        }
    }
    
    //MARK: 2 enum的模式匹配
    func enum_mode() {
        enum Sex {
            case man(height: [Int])
        }
    
        func getSex() -> Sex {
            return .man(height: [165,166,170,180])
        }
    
        let m1 = getSex()
    
        if case let Sex.man(height: h) = m1 {
            print(h)
        }
    }
    
    //MARK: 2 keyPath 读、写属性值
    func keyPath() {
        class Person: NSObject {
            var name : String?
            var contact : [Person] = []
            init(_ name:String) {
                super.init()
                self.name = name
            }
        }
    
        let p1 = Person("小明")
        let p2 = Person("小红")
        p1.contact.append(p2)
    
        let namePath = \Person.name
        print(p1[keyPath:namePath])
    
        let wKeyPath = \Person.contact[0].name
        print(p1[keyPath: wKeyPath]!)
    
        class Person2: NSObject {
            @objc var name : String?
            init(_ name:String) {
                super.init()
                self.name = name
            }
        }
    
        let p3 = Person2("小明")
        let name2 = p3.value(forKey: #keyPath(Person2.name))
        print(name2)
        let path1 = #keyPath(Person2.name)
        let path2 = \Person2.name
        print("\(path1) <---> \(path2)")
    }
    

    关于独占内存的特性 2 和SIMD的特性3,如果有具体实现代码,欢迎留言探讨~

    相关文章

      网友评论

        本文标题:Swift 5 新特性

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