前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift学习之5.3新特性

Swift学习之5.3新特性

作者头像
YungFan
发布2021-01-05 09:44:48
5360
发布2021-01-05 09:44:48
举报
文章被收录于专栏:学海无涯学海无涯

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

多尾随闭包

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

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

可比较枚举

枚举现在可以进行比较。

代码语言:javascript
复制
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 后面可以捕获多个异常的值。

代码语言:javascript
复制
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
代码语言:javascript
复制
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }
}
  • SwiftUI
代码语言:javascript
复制
@main
struct MyApp: App {
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

self改变

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

代码语言:javascript
复制
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 才会被调用。

代码语言:javascript
复制
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 语句中的条件可以按列对齐。

代码语言:javascript
复制
guard let x = optionalX,
      let y = optionalY else {
}

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

新增浮点型Float16

代码语言:javascript
复制
let number: Float16 = 5.0

新增日志API

提供了 5 种级别:

  • Debug:Debug时使用。
  • Info:可以在排查问题时使用。
  • Notice (default):默认,可以在排查问题时使用。
  • Error:在程序执行出错时使用。
  • Fault:在程序出现bug时使用。
代码语言:javascript
复制
// 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")

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多尾随闭包
  • 可比较枚举
  • 异常catch多值处理
  • @main
  • self改变
  • didSet性能提升
  • 语法缩进改进
  • 新增浮点型Float16
  • 新增日志API
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档