Swift 5.3:新增功能?

哈勃!Swift编程语言由于在iOS的编写应用程序中的使用而非常受欢迎,因此该领域的所有人都对它的开发感兴趣。

让我们看看Swift 5.3开发人员的新增功能。

多个尾随闭合


新版本(SE-0279)提供了用于有限闭包的新语法,该语法允许您以更易读的方式将多个闭包作为函数参数进行调用。这样可以最大程度地减少函数签名中括号的使用。

import Foundation

func load(url: String, success: (Data) -> Void, failure: (Error) -> Void) {
    
}

// old  version

load(url: "someURL", success: { data in }, failure: { error in })

// new multiple trailing closures

load(url: "someURL") { (data) in
    // do smth
} failure: { (error) in
    // do smth
}

在2个通话选项的示例中,可以看到,第二个通话选项看起来更好一些。

多模式捕获条款


当前,do-catch语句中的每个catch子句只能包含一个模式。要解决此问题,开发人员将使用switch选项的功能在catch语句的主体中包括模式匹配,从而增加嵌套和重复的代码(SE-0276)。

捕获项现在允许用户指定逗号分隔的模板列表,并能够将变量绑定到捕获主体,例如在开关中。

enum NetworkError: Error {
    case failure, timeout
}

// old  version
func networkCall(){
  do{
    try someNetworkCall()
  } catch NetworkError.timeout{
    print("timeout")
  } catch NetworkError.failure{
    print("failure")
  }
}

// new multi-Pattern catch clauses
func networkCall(){
  do{
    try someNetworkCall()
  } catch NetworkError.failure, NetworkError.timeout {
    print("handle for both")
  }
}

枚举的综合可比一致性


到目前为止,比较枚举的两个元素并不是一件“令人愉快的”事情。必须符合Comparable并编写一个静态函数<,以确定原始值是否小于另一个值。

现在,Swift(SE-0266)允许您不要为所有这些事情的实现“烦恼”,并且只要枚举具有相同的类型,就无需显式实现该协议。如果未指定相应的值,将按照声明的语义顺序对列表进行比较。

enum Brightness: Comparable {
    case low(Int)
    case medium
    case high
}

([.high, .low(1), .medium, .low(0)] as [Brightness]).sorted()
// [Brightness.low(0), Brightness.low(1), Brightness.medium, Brightness.high]

自我数量可以减少


从现在开始,可以在不再需要自我的那些地方省略自我(SE-0269)。以前,当我们从外部范围捕获值时,必须在闭包中使用self。

struct OldView: View {

    var body: some View {
        Button(action: {
            self.sayHello()
        }) {
            Text("Press")
        }
    }
    
    func sayHello() {}
}

struct NewView: View {

    var body: some View {
        Button {
            sayHello()
        } label: {
            Text("Press")
        }
    }
    
    func sayHello(){}
}

一般情况下


该语言的新版本(SE-0267)引入了将位置附加到泛型类型和扩展内部的功能。

struct Stack<Element> {
    private var array = [Element]()

    mutating func push(_ obj: Element) {
        array.append(obj)
    }

    mutating func pop(_ obj: Element) -> Element? {
        array.popLast()
    }
}

extension Stack {
    func sorted() -> [Element] where Element: Comparable {
        array.sorted()
    }
}

您可以向堆栈中添加新的sorted()方法,但仅在堆栈中的元素符合Comparable的情况下才可以。

新型浮法16


引入了Float16半精度浮点(SE-0277)。近年来,随着移动设备上机器学习的出现,这仅表明Apple推广该主题的雄心。Float 16通常在移动GPU上用于计算,并在ML应用中用作缩放比例的压缩格式。

let f16: Float16 = 7.29

Swift 5.3对Swift Package Manager(SPM)进行了许多增强。考虑他们。

  1. SE-0271(软件包管理器资源)允许SPM包含图像,音频,JSON等资源。
  2. SE-0272(软件包管理器二进制依赖性)允许SPM使用二进制软件包以及现有的源软件包支持。这意味着现在可以使用SPM集成共享的封闭源SDK(例如Firebase)。
  3. SE-0273(Package Manager条件目标依赖项)允许您配置目标,以便它们仅具有特定平台和配置的依赖项。例如,您可以在为Linux编译时指定特殊的其他框架。
  4. SE-0278允许您添加本地化的资源。

因此,可以说5.3版引入了一些优秀的创新,开发人员将随着时间的推移而逐渐采用。

All Articles