Swift 6.1 已正式发布,此版本包括用于提高生产力的语言特性增强、诊断改进、软件包 traits,以及正在进行的改进编译时间工作。
下面介绍 Swift 6.1 中的两个亮点:任务组的改进和成员可见性的优化。
Swift 6.1 中的任务组改进
在并发编程中,任务组是一个非常有用的工具。Swift 6.1 对任务组进行了优化,现在我们不再需要显式定义子任务的返回类型。编译器可以根据第一个任务自动推断所有子任务的返回类型,这让代码更加简洁。
例如,之前我们需要这样写:
await withTaskGroup(of: Int.self) { group in
for _ in 1...10 {
group.addTask {
return Int.random(in: 1...10)
}
}
}
而在 Swift 6.1 中,我们可以这样写:
await withTaskGroup { group in
for _ in 1...10 {
group.addTask {
return Int.random(in: 1...10)
}
}
}
这不仅减少了代码量,也让代码更具可读性。当然,所有子任务的返回类型仍需一致,否则编译器会报错。
Swift 6.1 中的导入成员可见性
Swift 6.1 引入了新的成员可见性模式,这让模块的使用更加直观。比如我们在两个模块中同时定义了对某个类的扩展,那么在使用时,编译器会选择哪个进行调用?
在 Swift 6.1 之前,编译器会报错,而在 Swift 6.1 中,编译器会根据导入的模块自动选择正确的扩展,避免了不必要的混淆。
例如,如果我们有两个模块 CurrencyKit
和 PurchaseParser
,它们都对 Int
类型进行了扩展:
// CurrencyKit
func price() -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale.current
let amount = Double(self) / 100.0
return formatter.string(from: NSNumber(value: amount)) ?? "$\(amount)"
}
// PurchaseParser
func price() -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale.current
let amount = Double(self) / 100.0
return formatter.string(from: NSNumber(value: amount)) ?? "$\(amount)"
}
在 Swift 6.1 中,编译器会根据导入的模块自动选择正确的扩展,避免了不必要的混淆。
来源:https://mp.weixin.qq.com/s/SyDVGyevVNzhat-cmGU9NA
详细更新说明查看发布公告:https://www.swift.org/blog/swift-6.1-released/