Swift 5.0 - 语言稳定性里程碑
发布时间: 2019年3月
最低支持: iOS 12.2+ / macOS 10.14.4+
核心特性
1. ABI 稳定性
- Swift 运行时成为系统的一部分
- 应用程序不再需要包含 Swift 标准库
- 大幅减少应用程序包大小
2. 原始字符串 (Raw Strings)
let regex = #"\\d{3}-\\d{3}-\\d{4}"#
let multiline = #"""
这是一个
多行原始字符串
"""#
3. 动态成员查找改进
@dynamicMemberLookup
struct Person {
subscript(dynamicMember member: String) -> String {
return "动态访问: \(member)"
}
}
let person = Person()
print(person.name) // "动态访问: name"
4. 可调用类型 (Callable Types)
@dynamicCallable
struct Calculator {
func dynamicallyCall(withArguments args: [Int]) -> Int {
return args.reduce(0, +)
}
}
let calc = Calculator()
let result = calc(1, 2, 3) // 6
5. 字符串插值改进
struct SQLQuery: ExpressibleByStringInterpolation {
struct StringInterpolation: StringInterpolationProtocol {
var sql: String = ""
init(literalCapacity: Int, interpolationCount: Int) {
sql.reserveCapacity(literalCapacity)
}
mutating func appendLiteral(_ literal: String) {
sql += literal
}
mutating func appendInterpolation<T: CustomStringConvertible>(_ value: T) {
sql += "'\(value)'"
}
}
let sql: String
init(stringInterpolation: StringInterpolation) {
self.sql = stringInterpolation.sql
}
}
let name = "John"
let query: SQLQuery = "SELECT * FROM users WHERE name = \(name)"
Swift 5.1 - 模块稳定性
发布时间: 2019年9月
最低支持: iOS 13.0+ / macOS 10.15+
核心特性
1. 模块稳定性
- 引入
.swiftinterface文件 - 不同 Swift 版本编译的模块可以互操作
2. 不透明返回类型 (Opaque Return Types)
protocol Shape {
func area() -> Double
}
struct Circle: Shape {
let radius: Double
func area() -> Double { .pi * radius * radius }
}
// 使用 some 关键字
func makeShape() -> some Shape {
return Circle(radius: 5.0)
}
3. 属性包装器 (Property Wrappers)
@propertyWrapper
struct Capitalized {
private var value: String = ""
var wrappedValue: String {
get { value }
set { value = newValue.capitalized }
}
}
struct Person {
@Capitalized var name: String
}
var person = Person()
person.name = "john doe"
print(person.name) // "John Doe"
4. 静态下标
struct Settings {
static subscript(key: String) -> String? {
return UserDefaults.standard.string(forKey: key)
}
}
let username = Settings["username"]
Swift 5.2 - 关键路径与调用站点表达式
发布时间: 2020年3月
最低支持: iOS 13.4+ / macOS 10.15.4+
核心特性
1. 关键路径表达式作为函数
struct User {
let name: String
let age: Int
}
let users = [
User(name: "Alice", age: 30),
User(name: "Bob", age: 25)
]
// 关键路径可以直接用作函数
let names = users.map(\.name)
let ages = users.map(\.age)
2. 调用站点表达式
func log(_ message: String, file: String = #file, line: Int = #line) {
print("[\(file):\(line)] \(message)")
}
log("Hello World") // 自动包含文件名和行号
3. 新的诊断架构
- 更准确的错误消息
- 更好的类型检查性能
Swift 5.3 - 多平台支持
发布时间: 2020年9月
最低支持: iOS 14.0+ / macOS 11.0+
核心特性
1. 多尾随闭包语法
UIView.animate(withDuration: 0.5) {
// 动画代码
view.alpha = 0
} completion: { _ in
// 完成代码
view.removeFromSuperview()
}
2. self 不再必需
class ViewController: UIViewController {
var name = "Default"
func setupHandler() {
someAsyncFunction { [weak self] in
guard let self else { return }
// 在捕获 self 后,可以省略 self.
name = "Updated"
updateUI()
}
}
}
3. 类型推断改进
// 可以省略显式类型
let numbers = [1, 2, 3].map { $0 * 2 }
4. 增强的枚举
enum AppState: CaseIterable {
case loading
case loaded(Data)
case error(Error)
// 支持 Comparable
static func < (lhs: AppState, rhs: AppState) -> Bool {
// 实现比较逻辑
return false
}
}
Swift 5.4 - 结果构建器
发布时间: 2021年4月
最低支持: iOS 14.5+ / macOS 11.3+
核心特性
1. 结果构建器 (Result Builders)
@resultBuilder
struct HTMLBuilder {
static func buildBlock(_ components: String...) -> String {
components.joined()
}
static func buildIf(_ component: String?) -> String {
component ?? ""
}
}
@HTMLBuilder
func makeHTML() -> String {
"<html>"
"<body>"
if true {
"<h1>Hello World</h1>"
}
"</body>"
"</html>"
}
2. 本地变量的属性包装器
func processData() {
@Clamped(0...100) var percentage = 150
print(percentage) // 100
}
3. 嵌套函数重载解析
func outer() {
func inner() -> String { "String version" }
func inner() -> Int { 42 }
let result: String = inner() // 明确类型选择
}
Swift 5.5 - async/await 并发编程
发布时间: 2021年9月
最低支持: iOS 15.0+ / macOS 12.0+
核心特性
1. async/await 语法
func fetchData() async throws -> Data {
let url = URL(string: "https://api.example.com")!
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
// 使用
Task {
do {
let data = try await fetchData()
print("获取到数据: \(data)")
} catch {
print("错误: \(error)")
}
}
2. Actor 模型
actor DataManager {
private var cache: [String: Data] = [:]
func getData(for key: String) -> Data? {
return cache[key]
}
func setData(_ data: Data, for key: String) {
cache[key] = data
}
}
let manager = DataManager()
Task {
await manager.setData(someData, for: "key")
let data = await manager.getData(for: "key")
}
3. 异步序列 (AsyncSequence)
for await line in URL(string: "https://example.com")!.lines {
print(line)
}
4. 结构化并发
func processMultipleItems() async {
await withTaskGroup(of: String.self) { group in
for i in 1...5 {
group.addTask {
return await processItem(i)
}
}
for await result in group {
print("处理结果: \(result)")
}
}
}
Swift 5.6 - 类型占位符
发布时间: 2022年3月
最低支持: iOS 15.4+ / macOS 12.3+
核心特性
1. 类型占位符
// 可以使用 _ 作为类型占位符
let numbers: [_] = [1, 2, 3] // 推断为 [Int]
let dictionary: [String: _] = ["key": 42] // 推断为 [String: Int]
2. #unavailable 属性
@available(iOS 15, *)
func newFeature() {
if #unavailable(iOS 16) {
// iOS 16 之前的代码
useOldImplementation()
} else {
// iOS 16+ 的代码
useNewImplementation()
}
}
3. 更好的类型推断
// 复杂泛型场景的类型推断改进
let result = someComplexGenericFunction() // 更好的推断
Swift 5.7 - 泛型改进
发布时间: 2022年9月
最低支持: iOS 16.0+ / macOS 13.0+
核心特性
1. 不透明参数类型
func process<T: Collection>(_ items: T) where T.Element: Equatable {
// 处理逻辑
}
// 简化为
func process(_ items: some Collection<some Equatable>) {
// 处理逻辑
}
2. 主 Actor 隔离
@MainActor
class ViewModel: ObservableObject {
@Published var data: [String] = []
func updateData() {
// 自动在主线程执行
data.append("New Item")
}
}
3. 正则表达式支持
import RegexBuilder
let regex = /\d{3}-\d{3}-\d{4}/
let input = "我的电话是 123-456-7890"
if let match = input.firstMatch(of: regex) {
print("找到电话号码: \(match.0)")
}
// 使用 RegexBuilder
let phoneRegex = Regex {
Repeat(.digit, count: 3)
"-"
Repeat(.digit, count: 3)
"-"
Repeat(.digit, count: 4)
}
4. 增强的泛型系统
protocol Animal {
associatedtype Food
func eat(_ food: Food)
}
// 使用 primary associated types
func feedAnimals<A: Animal<Grass>>(_ animals: [A]) {
// 现在可以直接指定关联类型
}
Swift 5.8 - 函数反向部署
发布时间: 2023年3月
最低支持: iOS 16.4+ / macOS 13.3+
核心特性
1. 函数反向部署
@backDeployed(before: iOS 16.0)
@available(iOS 14.0, *)
func newFunction() {
// 这个函数可以在 iOS 14+ 使用,即使是在 iOS 16 中新增的
}
2. 改进的结果构建器
@resultBuilder
struct ConditionalBuilder {
static func buildEither(first component: String) -> String {
component
}
static func buildEither(second component: String) -> String {
component
}
static func buildOptional(_ component: String?) -> String {
component ?? ""
}
}
3. 更好的错误消息
- 类型检查错误更清晰
- 更准确的错误位置标识
Swift 5.9 - 宏系统
发布时间: 2023年9月
最低支持: iOS 17.0+ / macOS 14.0+
核心特性
1. 宏系统 (Macros)
// 表达宏
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(
module: "MacroExamples",
type: "StringifyMacro"
)
let result = #stringify(1 + 2) // (3, "1 + 2")
// 附加宏
@attached(member, names: named(init))
public macro DictionaryStorage() = #externalMacro(
module: "MacroExamples",
type: "DictionaryStorageMacro"
)
@DictionaryStorage
struct Person {
var name: String
var age: Int
// 宏会自动生成 init 方法
}
2. if 和 switch 表达式
// if 表达式
let result = if condition {
"true branch"
} else {
"false branch"
}
// switch 表达式
let message = switch status {
case .loading: "加载中..."
case .success: "成功"
case .error: "错误"
}
3. 类型参数包 (Type Parameter Packs)
func values<each T>(_ value: repeat each T) -> (repeat each T) {
return (repeat each value)
}
let result = values(1, "hello", true) // (1, "hello", true)
Swift 5.10 - 完整并发检查
发布时间: 2024年3月
最低支持: iOS 17.4+ / macOS 14.4+
核心特性
1. 完整并发检查
// 启用完整并发检查
// 在编译设置中添加 -strict-concurrency=complete
class MyClass: Sendable {
let immutableProperty: String
init(value: String) {
self.immutableProperty = value
}
}
2. 改进的 Sendable 检查
// 更严格的 Sendable 协议检查
@Sendable func processData(_ data: Data) async {
// 确保所有捕获的值都是 Sendable
}
3. 嵌套协议
protocol OuterProtocol {
protocol InnerProtocol {
func innerMethod()
}
associatedtype Inner: InnerProtocol
}
Swift 6.0 - 数据隔离与安全
发布时间: 2024年9月
最低支持: iOS 18.0+ / macOS 15.0+
核心特性
1. 数据隔离改进
// 更强的数据隔离保证
@MainActor
class ViewController {
var data: [String] = []
nonisolated func backgroundTask() {
// 这个方法不在主 Actor 上运行
Task { @MainActor in
// 显式切换到主 Actor
data.append("新数据")
}
}
}
2. 类型化异常 (Typed Throws)
enum NetworkError: Error {
case timeout
case invalidURL
}
func fetchData() throws(NetworkError) -> Data {
// 只能抛出 NetworkError 类型的错误
throw NetworkError.timeout
}
// 使用
do {
let data = try fetchData()
} catch {
// error 的类型是 NetworkError
switch error {
case .timeout:
print("请求超时")
case .invalidURL:
print("无效URL")
}
}
3. Pack 迭代
func processValues<each T>(_ values: repeat each T) {
repeat print(each values)
}
processValues(1, "hello", true)
// 输出:
// 1
// hello
// true
4. 改进的 Sendable 推断
// 编译器可以更好地推断 Sendable 符合性
struct Point {
let x: Double
let y: Double
}
// 自动符合 Sendable,因为所有存储属性都是 Sendable
学习建议与最佳实践
1. 学习路径建议
- 基础语法 (Swift 5.0-5.2): 掌握核心语法和 ABI 稳定性
- 现代特性 (Swift 5.3-5.4): 学习属性包装器和结果构建器
- 并发编程 (Swift 5.5): 深入理解 async/await 和 Actor
- 高级特性 (Swift 5.6-5.8): 掌握类型系统改进
- 宏与元编程 (Swift 5.9+): 学习宏系统
- 并发安全 (Swift 5.10-6.0): 完整并发模型
2. iOS 版本支持策略
- Swift 5.0-5.3: 支持 iOS 12+,适合广泛兼容
- Swift 5.4-5.5: 需要 iOS 14+,引入现代并发
- Swift 5.6-5.8: 需要 iOS 15+,类型系统改进
- Swift 5.9+: 需要 iOS 17+,最新特性
3. 实际项目应用建议
- 根据项目的最低 iOS 版本选择合适的 Swift 特性
- 优先使用稳定特性,谨慎使用实验性功能
- 在团队中建立 Swift 编码规范
- 定期更新项目以使用新的语言特性
4. 性能优化要点
- 合理使用
some和泛型 - 理解值类型 vs 引用类型的性能影响
- 正确使用并发特性避免数据竞争
- 利用编译器优化特性