iOS 的那些事儿

Swift 5 新特性

2020-04-06  本文已影响0人  uniapp

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,如果有具体实现代码,欢迎留言探讨~

上一篇下一篇

猜你喜欢

热点阅读