附录C @ 属性与 # 指令速查

附录C:@ 属性与 # 指令速查

@ 通常修饰声明,# 通常出现在表达式、编译控制或编译期字面量中。两者都会影响编译器行为,但作用时机和适用位置不同。

C.1 常用 @ 属性

属性作用示例
@available声明可用性@available(macOS 13, *)
@autoclosure表达式自动包装为闭包func log(_ message: @autoclosure () -> String)
@backDeployed回部署到旧系统库兼容
@concurrent要求并发执行@concurrent func work() async
@discardableResult允许忽略返回值保存、打印类函数
@dynamicCallable动态调用语法脚本桥接
@dynamicMemberLookup动态成员查找JSON 包装
@escaping闭包可逃逸保存回调
@frozen冻结枚举或结构体 ABI库演化
@globalActor自定义全局 actor@MyActor
@inlinable跨模块内联公共热路径
@inline强制或禁止内联@inline(never)、@inline(always)、@inline(__always)
@MainActor主 actor 隔离UI 状态
@nonobjc不暴露给 Objective-C兼容层
@objc暴露给 Objective-C选择器、旧框架
@preconcurrency兼容旧并发标注迁移
@propertyWrapper属性包装器@Clamped
@resultBuilder结果构建器SwiftUI、DSL
@ViewBuilderSwiftUI 提供的结果构建器,让块里能写 if / switch / ForEach视图声明(第 15B.18 节)
@retroactive显式追溯性协议遵循扩展外部类型
@Sendable可安全跨隔离域并发闭包
@testable测试导入@testable import App
@unchecked关闭部分检查@unchecked Sendable
@usableFromInline允许内联代码引用库内部优化
@warn_unqualified_access未限定访问时警告避免同名成员混淆

C.2 编译控制与字面量

指令用途
#if / #elseif / #else / #endif条件编译
#available运行时可用性判断
#unavailable不可用性判断
#warning编译警告
#error编译错误
#sourceLocation临时调整源码位置
#selectorObjective-C 选择器
#keyPath旧式键路径字符串

C.3 编译期字面量

字面量内容
#file模块名 + 文件名(Swift 6 模式下与 #fileID 相同,详见 2.6)
#fileID模块和文件名
#filePath完整文件路径
#line行号
#column列号
#function函数名
#dsohandle动态共享对象句柄

C.4 宏相关

名称用途
#externalMacro指向宏实现
#Preview生成 SwiftUI 预览
#expect / #requireSwift Testing 断言

C.5 使用原则

  • 不要因为属性“看起来高级”就随手添加。
  • 能用普通语法表达的,优先普通语法。
  • 属性一旦进入公共 API,可能影响二进制兼容性。
  • @preconcurrency、@unchecked Sendable 和 nonisolated(unsafe) 属于迁移工具,不是长期解决方案。
最后修改 September 19, 2026: 更新 (3489033b1)