Swift 5.9 新特性

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

if与switch表达式

if与switch语句可以作为表达式使用。

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)\"")
相关推荐
美狐美颜SDK开放平台10 小时前
准备开发直播APP?视频美颜SDK接入前的十项检查清单
android·ios·音视频·直播美颜sdk·视频美颜sdk
承渊政道1 天前
iOS远程控制电脑用什么好?iPhoneiPad远程控制Windows电脑最佳方案2026横评
windows·ios·远程控制·1024程序员节·iphone ipad
茶底世界之下1 天前
彩色建筑适合转黑白吗?用 Awaking 检查颜色消失后的层次
ios
黑科技iOS上架1 天前
App Store 26年10月新应用审核放缓大量应用不进审
ios·审核
OxYGC1 天前
手机为什么能“自动跳过“开屏广告?李跳跳、GKD 与 iOS 代理软件原理盘点
android·ios·开屏广告·广告屏蔽
终端安全笔记1 天前
一份配置管十项 AI 功能:它关的是入口,不是数据
网络安全·ios·移动设备管理
2501_915106322 天前
跨平台抓包工具怎么选?TraceEagle抓包鹰 的四种跨平台能力
网络协议·计算机网络·网络安全·ios·adb·https·udp
黑科技iOS上架2 天前
iOS应用上架:提前规避审核被拒风险
ios·审核
茶底世界之下2 天前
方图一定要裁照片吗?用 Awaking 比较裁切与留白
ios
00后程序员张2 天前
无需 Mac 的 iOS App 上架工具,开心上架Appuploader 负责哪些环节
android·ios·小程序·https·uni-app·iphone·webview