Swift 版本特性回顾指南


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. 学习路径建议

  1. 基础语法 (Swift 5.0-5.2): 掌握核心语法和 ABI 稳定性
  2. 现代特性 (Swift 5.3-5.4): 学习属性包装器和结果构建器
  3. 并发编程 (Swift 5.5): 深入理解 async/await 和 Actor
  4. 高级特性 (Swift 5.6-5.8): 掌握类型系统改进
  5. 宏与元编程 (Swift 5.9+): 学习宏系统
  6. 并发安全 (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 引用类型的性能影响
  • 正确使用并发特性避免数据竞争
  • 利用编译器优化特性
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容