Swift 5.9 新特性

Swift 5.9 内置于 Xcode 15,虽然是 Swift 5 的最后一个大版本,仍然增加了不少新特性。

if与switch表达式

ifswitch语句可以作为表达式使用。

swift 复制代码
let score = 90
let result1 = if score >= 60 {
    "及格"
} else {
    "不及格"
}
print(result1)

let result2 = switch score {
case 0 ..< 60:
    "不及格"
case 60 ..< 70:
    "及格"
case 70 ..< 80:
    "中等"
case 89 ..< 90:
    "良好"
case 90 ... 100:
    "优秀"
default:
    "其他"
}
print(result2)

~Copyable不可复制

  • 引入了"不可复制的枚举与结构体"的概念。
  • 不可复制的枚举与结构体需要遵守~Copyable协议。
  • 枚举与结构体如果遵守了~Copyable协议,则除了Sendable协议再也不能遵守其他任何协议。
swift 复制代码
struct Person: ~Copyable {
    var name = "Zhangsan"
    var age = 10
    let sex = "male"
}

let person = Person()
print(person.name, person.age, person.sex)

// 报错:Cannot consume noncopyable stored property 'person' that is global
let personCopy = person
print(personCopy.name, personCopy.age, personCopy.sex)

Clock增加sleep(for:)方法

swift 复制代码
let clock1 = ContinuousClock()
try? await clock1.sleep(for: .seconds(1))
let clock2 = SuspendingClock()
try? await clock2.sleep(for: .seconds(1))

// 应用于Concurrency
Task {
    print("start task...")

    // Swift5.7之后,Swift5.9之前
    try await Task.sleep(until: .now + .seconds(1), clock: .suspending)
    // Swift5.9之后
    try await Task.sleep(for: .seconds(1), clock: .suspending)

    print("continue task...")
}

// 异步函数
func doSomeAsyncWork() async throws {
    print("start to work...")
    // Swift5.7之后,Swift5.9之前
    try await Task.sleep(until: .now + .seconds(3), clock: .continuous)
    // Swift5.9之后
    try await Task.sleep(for: .seconds(3), clock: .continuous)

    print("continue to work...")
}

Macros

介绍

  • Swift 5.9 引入了一个重要新功能 --- 宏。
  • 宏可以在编译前动态地操作代码,从而能够在编译时注入额外的功能。

分类

  • 独立 Macro:通过@freestanding关键字声明,使用时以标签#开头,并在后边的()中添加对应的参数,主要作用是代替代码中的内容。
  • 附加 Macro:通过@attached关键字声明,使用时以标签@开头,并在后边的()中添加对应的参数,主要作用是为声明添加代码。

使用步骤

  1. 每个 Macro 都是 Package,因此需要通过 Xcode 菜单 ---> File ---> New ---> Package... ---> Swift Macro 创建 Macro Package。
  2. Sources:源码目录包含 3 个子文件夹。
    • [Macro name]:包含创建 Macro 的声明源文件。
    • [Macro name]Client:包含创建 Macro 的使用源文件。
    • [Macro name]Macros:包含创建 Macro 的实现源文件。
  3. 在使用 Macro 的地方,可以通过选中宏 ---> 右键菜单 ---> Expand Macro 在下方显示展开后的代码。
swift 复制代码
// 声明源文件 [Macro name].swift
// 定义一个宏函数,接收一个泛型参数,返回原始值与对应字符串组成的元组,函数实现在FirstMacroMacros的StringifyMacro
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(module: "FirstMacroMacros",
                                                                      type: "StringifyMacro")

// 实现源文件 [Macro name]Macro.swift
public struct StringifyMacro: ExpressionMacro {
    public static func expansion(
        of node: some FreestandingMacroExpansionSyntax,
        in context: some MacroExpansionContext
    ) -> ExprSyntax {
        guard let argument = node.argumentList.first?.expression else {
            fatalError("compiler bug: the macro does not have any arguments")
        }

        return "(\(argument), \(literal: argument.description))"
    }
}
// 导出Macro以供使用
@main
struct FirstMacroPlugin: CompilerPlugin {
    let providingMacros: [Macro.Type] = [
        StringifyMacro.self,
    ]
}


// 使用源文件 main.swift
import FirstMacro

let a = 10
let b = 20
let (result, code) = #stringify(a + b)
print("The value \(result) was produced by the code \"\(code)\"")
相关推荐
sakiko_4 小时前
UIKit学习笔记4-使用UITableView制作滚动视图
笔记·学习·ios·swift·uikit
小锋学长生活大爆炸7 小时前
【开源软件】这次iPhone也是用上Claw了 | PhoneClaw
ios·开源软件·iphone·claw
SameX11 小时前
独立开发一个把走过的路变成 km² 的 App,聊聊 25m 网格和后台 GPS 的坑
ios
XD74297163613 小时前
科技早报晚报|2026年4月30日:Agent 安全壳、浏览器 iOS 测试台与可穿戴数据 API,今天更值得看的 3 个技术机会
科技·ios·开源项目·科技新闻·开发者工具
北京自在科技15 小时前
Find Hub App 小更新
android·ios·安卓·findmy·airtag
2501_9159214316 小时前
HTTPS前端劫持 新一代流量劫持解决方案
前端·网络协议·ios·小程序·https·uni-app·iphone
911hzh16 小时前
Flutter WebRTC iOS 原理解析:从 getUserMedia 到 Texture,讲清视频采集、纹理渲染与远端通话链路
flutter·ios·webrtc
软泡芙16 小时前
【iOS】 开发入门指南
ios
水中加点糖17 小时前
ios中使用DockKit和CoreML实现自定义目标的自动跟随(一)
目标检测·ios·目标跟踪·硬件控制·dockkit
2501_9159090617 小时前
iOS应用签名的三种方法全解析:从官方到第三方工具
android·ios·小程序·https·uni-app·iphone·webview