Swift 6.1 新特性
2025年4月3日 11:50
Swift 6.1 内置于 Xcode 16.3,这是 Swift 6 之后的首个小版本更新,新特性很少。
尾随逗号
元组、函数的参数、闭包捕获列表以及字符串插值等都可以像数组一样,在最后一个元素的后面添加,
,以便轻松地追加、删除、重新排列或者注释最后一个元素。
// 元组
(404, "Not Found",)
// 函数的参数
func sum(num1: Int, num2: Int,) -> Int {
num1 + num2
}
var vehicle = "Car"
// 闭包捕获列表
let closure = { [vehicle,] in
print("Vehicle:", vehicle)
}
// 字符串插值
"This is a \(vehicle,)"
混合开发
介绍
- 增加新的关键字
@implementation
,配合@objc
可以为 Objective-C 导入的.h
声明提供实现。 - 实现方式:在 Swift 中扩展 Objective-C 类,然后通过
@objc @implementation
实现属性与方法以替换 Objective-C 的@implementation
。
实现
- 新建一个基于 Swift 语言的 iOS 项目。
- 创建一个 Objective-C 类,此时会弹出一个提醒对话框(添加这个文件会创建一个 Objective-C 与 Swift 的混合项目,你是否希望 Xcode 自动配置一个桥接头文件来让 2 种语言的类文件相互可见?),点击
Create Bridging Header
。 - 项目中多出 3 个文件,分别为创建的 Objective-C 类文件(
.h
与.m
)与 Bridging Header 文件,修改 Objective-C 类文件如下。
// .h文件
@interface Person: NSObject
@property(nonatomic, copy) NSString *name;
-(void)eat;
@end
// .m文件
// @implementation Person
// @end
- 在 Bridging Header 文件中通过
#import "类名.h"
导入所有需要使用的 Objective-C 类的头文件。 - 在 Swift 中实现并且调用 Objective-C。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 调用
let person = Person()
person.name = "zhangsan"
person.eat() // zhangsan吃饭了
}
}
// MARK: - @objc @implementation extension Objective-C类
@objc @implementation extension Person {
// 实现属性
var name: String?
// 实现方法
func eat() {
print("\(name ?? "")吃饭了")
}
}
注意:一旦在 Swift 进行了实现,Objective-C 中的
@implementation
不需要再实现,否则会报2 duplicate symbols
的编译错误。
并发编程
- actor 允许在属性与函数上使用
nonisolated
,表示该 API 可以在任何并发上下文中安全调用。Swift 6.1 将nonisolated
支持到了类型与扩展,这样其内的所有属性与方法不需要再单独添加nonisolated
。
// 结构体
nonisolated struct Station {
}
class Train {
}
// 扩展
nonisolated extension Train {
}
-
withTaskGroup()
与withThrowingTaskGroup()
的闭包可以推断出子任务结果类型。
// Swift6.1之前
await withTaskGroup(of: Int.self) { group in
...
}
await withThrowingTaskGroup(of: String.self) { group in
...
}
// Swift6.1之后
await withTaskGroup { group in
...
}
await withThrowingTaskGroup { group in
...
}