美文网首页Swift
Swift学习之5.3新特性

Swift学习之5.3新特性

作者: YungFan | 来源:发表于2021-01-04 08:45 被阅读0次

    Swift 5.3 内置于 Xcode 12,新增了多项实用功能。

    多尾随闭包

    Swift 5.3 之前即使有多个尾随闭包也只有最后一个能被写成精简的形式,这种写法一个闭包在圆括号内,另一个在外面。新的写法把这些闭包都放在圆括号外面,显得更加简洁。注意:尾随闭包中的第一个闭包的标签会被强制省略。

    • UIKit
    UIView.animate(withDuration: 0.5) {
        // animation code
    } completion: { _ in
        // completion code
    }
    
    • SwiftUI
    struct ContentView: View {
        
        var body: some View {
            Button {
                print("login")
            }         
            label: {
                Text("登录")
            }
        }
    }
    

    可比较枚举

    枚举现在可以进行比较。

    enum Size: Comparable {
        case xs
        case sm
        case md
        case lg
    }
    
    let small = Size.sm
    let large = Size.lg
    
    if small < large {
        print("small < large")
    }
    

    异常catch多值处理

    Swift 5.3 以后,catch 后面可以捕获多个异常的值。

    enum FileReadError: Error {
        case FileISNull
        case FileNotFound
    }
    
    func readFileContent(filePath: String) throws -> String {
        if filePath == "" {
            throw FileReadError.FileISNull
        }
    
        if filePath != "/User/Desktop/123.plist" {
            throw FileReadError.FileNotFound
        }
    
        return "123"
    }
    
    do {
        let result = try readFileContent(filePath: "abc")
        print(result)
    } catch FileReadError.FileISNull, FileReadError.FileNotFound { // 同时处理
        print("出现错误")
    } catch {
        // 有一个隐含参数 error
        print(error)
    }
    

    @main

    声明程序的入口点,替换掉以前的@UIApplicationMain

    • UIKit
    @main
    class AppDelegate: UIResponder, UIApplicationDelegate {
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            return true
        }
    }
    
    • SwiftUI
    @main
    struct MyApp: App {
        
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    

    self改变

    以前闭包中引用当前范围的内容时必须带上self.,Swift 5.3 之后如果不产生循环引用可以省略self.。这个新特性对 SwiftUI 来说非常友好,因为 SwiftUI 中的 View 保存在值类型的结构体中,所以不会发生循环引用。

    struct ContentView: View {
        
        @State private var count = 1
        
        var body: some View {
            VStack {
                Button {
                    count += 1 // 可以不用self.count
                } label: {
                    Text("+1")
                }
                
                Text("\(count)")
            }
        }
    }
    

    didSet性能提升

    以前在一个属性中使用 didSet 时,总是调用 getter 来获取该属性的 oldValue(即使没有用到),从而影响性能。Swift 5.3 之后只有在didSet中使用了oldValue参数时,getter 才会被调用。

    class Person {
        var age = 10 {
            didSet {
                print("age didSet")
            }
        }
    
        var sex = "男" {
            didSet {
                print(oldValue) // 使用oldValue
                print("sex didSet")
            }
        }
    }
    
    let p = Person()
    // 不会调用getter
    p.age = 20
    // 会调用getter
    p.sex = "女"
    

    语法缩进改进

    guard 和 if 语句中的条件可以按列对齐。

    guard let x = optionalX,
          let y = optionalY else {
    }
    
    if let x = optionalX,
       let y = optionalY {
    }
    

    新增浮点型Float16

    let number: Float16 = 5.0
    

    新增日志API

    提供了 5 种级别:

    • Debug:Debug时使用。
    • Info:可以在排查问题时使用。
    • Notice (default):默认,可以在排查问题时使用。
    • Error:在程序执行出错时使用。
    • Fault:在程序出现bug时使用。
    // 1.导入模块
    import os
    
    // 2.创建Logger实例
    let logger = Logger()
    
    // 3.使用log函数
    logger.log(level: .debug, "test")
    logger.log(level: .info, "test")
    logger.log(level: .default, "test")
    logger.log(level: .error, "test")
    logger.log(level: .fault, "test")
    

    其他

    • Swift Package Manager 功能增强。
    • Swift 语言性能继续提升。

    相关文章

      网友评论

        本文标题:Swift学习之5.3新特性

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