Swift 语言速查表

面向「已经会编程」的 Swift 6 速查表:一页一个主题,表格 + 可切换标签页,专治“我记得有这个语法,但忘了怎么写”

Swift 语言速查表

这不是教程,是字典。教程教你走路,字典只在你卡住时递上一根拐杖。所以本页写得密、写得短、写得没什么耐心——每一条都假设你已经会编程,只是记不清 Swift 里这个动作该怎么写。

风格上参考 Rust Language Cheat Sheet,但内容完全按 Swift 6 重写:Swift 没有借用检查器,却有多标签、有 async/await、有值语义与引用语义的分野,还有一整套只有 Apple 生态才有的东西。所以照搬没有意义,该不一样的地方就让它不一样。

语言版本基线:Swift 6.4(写作时本机工具链的实际版本),示例一律按 Swift 6 语言模式(严格并发检查)编写。凡是只在新版本里才有的东西,都会当场标注 🆕。


图例说明

符号含义
🔥高频使用,值得先记住
⚠️陷阱或易错点,踩过一次就该记住
🛑错误示例,故意写错给你看
🆕较新版本才有的语法,注意 #available 或工具链版本
🚧有限制、仍在演进,或者只在特定平台可用
🝖偏深的内容,第一遍可以跳过
💭笔者见解,不是官方定论
↪等价写法或语法糖展开
📘指向官方文档或权威资料

关于 // prints::它标的是这段代码真实跑出来的输出。跟在后面的缩进 // 行表示"依次输出了好几行";行尾那些中文注解(⚠️ 🛑 之类)只是给人看的,不属于输出内容。所有示例都在 Swift 6.4、-swift-version 6 下实跑过。


目录导航

主题内容一句话
01 起步与运行方式工具链怎么装、一段代码有哪五种跑法
02 语言主干变量、运算符、控制流、let 绑定全表、模式匹配
03 类型与字符串数值的边界、字符与字符串的所有写法、正则与格式化
04 集合与序列数组、字典、集合、元组、区间与高阶函数
05 函数与闭包参数标签、inout、尾随闭包、捕获列表
06 可选值? 与 ! 的完整解包手册
07 自定义类型结构体、类、枚举、actor,以及属性与下标的全部形态
08 协议与泛型协议、关联类型、some 与 any
09 错误处理与并发throws、async/await、actor、Sendable
10 内存与值语义值传递还是引用传递、ARC、写时复制、指针
11 标准库速查常用协议、格式化、Codable、KeyPath、结果构建器
12 语法糖与简写对照一份代码的完整写法与简写并排看
13 工具链与工程swift 命令表、Package.swift 模板、测试与条件编译
14 类型转换与互操作is / as? / as!、Any 与元类型、Mirror、Objective-C 边界
15 宏与调试宏的声明与实现、@ 属性全表、断言家族与调试输出
16 血泪速查按症状索引的踩坑表:会怎么写 / 实际发生什么 / 正确写法

你好,Swift!

先让第一行代码跑起来。Swift 和那些「先装 SDK 再看文档」的语言不太一样:只要有 Xcode 或官方工具链,命令行里敲一个 swift 就能进交互模式。

1
2
// hello.swift
print("Hello, world!")
1
2
$ swift hello.swift
Hello, world!

print 默认会换行。不想换行就传 terminator:

1
2
3
print("A", terminator: "")
print("B")
// prints: AB

Swift 擅长这些事

  • 性能:编译成原生机器码,没有虚拟机也没有 JIT 预热,适合从命令行工具到实时音频的各种负载。
  • 安全:可选值、值语义、默认的数组越界检查、严格的初始化规则,把大量运行时崩溃变成了编译期错误。
  • 并发:async/await、actor、Sendable 都由编译器做检查,“数据竞争"在 Swift 6 里是编译错误而不是线上事故。
  • 表达力:泛型、协议扩展、结果构建器、宏,让库作者能写出看起来像语言内置的 API(@ViewBuilder 就是靠这套东西做到的)。
  • 互操作:与 C、C++、Objective-C 都能直接互调,也能被 Objective-C 与 Python 调用。🚧
  • 一套语言,全平台:同一份代码从 watchOS 写到 Linux 服务端;SwiftPM 在 Apple 与 Linux 上都能用。

你可能会嫌它烦的地方

  • 编译器慢:类型检查器遇上深层表达式会变慢,全量类型推断偶尔需要你主动写注解来"帮它一把"。
  • Apple 优先:SwiftUI、Combine、大部分系统框架只在 Apple 平台可用;Linux 上只有 Swift Foundation 与少数服务端框架。🚧
  • 版本分裂:Swift 语言版本、语言模式(5/6)、平台部署目标、工具链版本,是四件不同的事,混起来能绕晕人。
  • ABI 与生态:包管理器生态比主流语言小得多,很多领域得自己写或用 C 库。
  • 字符串不按字节走:String 的索引不是整数,刚上手会觉得处处别扭——但它是对的,见 03 类型与字符串。

macOS

  • 想要完整生态(SwiftUI、App Store 开发):从 App Store 装 Xcode。
  • 只想要命令行工具链:xcode-select --install,或者用 swiftly 管理多套工具链。

Linux

  • 从 swift.org/download 下载官方 tarball,或用发行版仓库。Ubuntu 上官方推荐用 swiftly。

Windows 🚧

  • 官方支持仍在完善,Windows 版工具链可以从 swift.org 获取,但系统框架相关的能力有限。
1
2
3
$ swift --version
swift-driver version: 1.168.6 Apple Swift version 6.4 (swiftlang-6.4.0.34.1)
Target: arm64-apple-macosx26.0
场景推荐说明
Apple 平台开发XcodeSwiftUI 预览、Instruments、模拟器,一步到位
跨平台 / 服务端VS Code + Swift 扩展底层就是 SourceKit-LSP,配合 SwiftPM 用着很顺
JetBrains 用户VS Code / CLion 的 Swift 插件 🚧AppCode 已停止维护,CLion 插件仍在跟进
只想试几句swift repl 或 SwiftFiddle不用装任何东西

三条建议,按重要性排序:

  1. 别顺读。 卡住了去目录里点,解决问题就走。
  2. 留意切换标签。 本速查表大量使用多标签对比同一种效果的几种写法,比如「完整写法 / 尾随闭包 / $0 简写」——这页最值钱的东西都藏在那里。
  3. 把 ⚠️ 当正文读。 速查表的错误示例,往往比正确示例更省时间。

💭 已经出事了(崩溃、结果不对、编译莫名其妙不过)?别从头翻,直接去 16 血泪速查——那一章是按症状索引的,每条都写着"你会怎么写 / 实际发生什么 / 正确写法"。

💭 如果你想要系统学一遍而不是速查,隔壁的 Swift 基础部分 是按学习顺序写的教程;本目录负责在你忘了怎么写的时候救急。


一个 Swift 源文件长什么样

同一份"打印问候语"的功能,在不同工程形态下的最小骨架不太一样。搞混了会觉得 Swift 到处是规矩,其实只是入口不同。

1
2
3
4
// greet.swift —— 顶层代码是允许的,从上往下顺序执行
let name = "Swift"
print("你好,\(name)!")
// prints: 你好,Swift!
1
$ swift greet.swift

也可以在文件头加 shebang,直接当可执行文件跑:

1
2
#!/usr/bin/env swift
print("hello from shebang")
1
2
3
// Sources/Hello/main.swift
// SwiftPM 会把 main.swift 当作程序的入口文件
print("Hello from SwiftPM")
1
$ swift run Hello

不想用 main.swift,也可以在任何文件里写 @main:

1
2
3
4
5
6
7
// Sources/Hello/Hello.swift
@main
struct Hello {
    static func main() {
        print("Hello from @main")
    }
}

⚠️ 用 swiftc 直接编单个文件时,这个文件会被当成"允许顶层代码的入口",@main 反而报错。想单文件验证,加 -parse-as-library:

1
2
3
$ swiftc atmain.swift -o app
atmain.swift:1:1: error: 'main' attribute cannot be used in a module that contains top-level code
$ swiftc -parse-as-library atmain.swift -o app    # ✅

SwiftPM 里不用管这条,因为包里的文件本来就不是按"入口脚本"编的。

App 的入口不是 main 函数,而是一个带 @main 的类型:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

UIKit 老写法里还有 @UIApplicationMain 和 application(_:didFinishLaunchingWithOptions:),新项目基本不用了。🝖

1
2
3
4
5
6
7
// Sources/MyLib/Greeter.swift
public struct Greeter {
    public init() {}
    public func greet(_ name: String) -> String {
        "你好,\(name)!"
    }
}

库没有入口,只有 public 才能被外部看到。想看这一块的全部细节,去 13 工具链与工程。


版本这件事,先理清楚

Swift 里"版本"有四个互不相同的含义,网上的报错信息经常把它们混着说:

概念例子影响什么
工具链版本Swift 6.4你能用哪些语法、编译器有哪些新检查
语言模式-swift-version 6是否启用严格并发检查、Sendable 违规是警告还是错误
部署目标iOS 26 / macOS 26什么 API 能直接调用,什么必须 if #available
包版本swift-tools-version: 6.2Package.swift 能写哪些清单 API
1
2
3
4
5
if #available(macOS 26, iOS 26, *) {
    // 新 API 直接调用
} else {
    // 老系统上退回到兼容实现
}

⚠️ 语言模式不是工具链版本。用 Swift 6.4 的工具链,依然可以把某个 target 设成 Swift 5 语言模式,此时并发相关的严格检查会退化成警告。


官方资料去哪儿找

资料链接什么时候用
The Swift Programming Languagedocs.swift.org语言语义的权威答案
Swift Standard Librarydeveloper.apple.com/documentation/swift查具体 API 签名
Swift Evolutionswift-evolution想知道某个语法是哪版加的、为什么这么设计
Swift.org 博客swift.org/blog新版本特性解读
Swift Forumsforums.swift.org官方团队会下场回答的社区

01 起步与运行方式

Swift 代码的五种跑法、源文件的五个零件、常用编译选项与报错速查

02 语言主干

常量与变量、运算符优先级、控制流、let 绑定语法全表与模式匹配

03 类型与字符串

整数与浮点的边界、Character 与 String 的全部写法、正则、格式化

04 集合与序列

数组、字典、集合、元组、区间的全部常用操作,附复杂度与陷阱

05 函数与闭包

参数标签、可变参数、inout、闭包简写、捕获列表与 @escaping 的完整速查

06 可选值

T? 的本质、五种解包方式、可选链、?? 与 map/flatMap 的完整用法

07 自定义类型

结构体、类、枚举、actor 的选择,初始化器家族,属性与下标的全部形态

08 协议与泛型

协议、关联类型、主关联类型、some 与 any、协议扩展与自动合成的完整速查

09 错误处理与并发

throws / try / Result 与 async / await / actor / Sendable 的完整速查

10 内存与值语义

值传递还是引用传递、写时复制、独占访问、ARC 与循环引用、不可复制类型与内存布局

11 标准库速查

常用协议、格式化、Codable、KeyPath、结果构建器与日期时钟的速查表

12 语法糖与简写对照

同一段代码的完整写法与简写并排看:闭包、可选值、属性、初始化器、协议与 DSL

13 工具链与工程

swift / swiftc / SwiftPM 命令表、Package.swift 模板、Swift Testing 与条件编译

14 类型转换与互操作

is / as / as? / as! 的分工、Any 与元类型、Mirror 反射,以及与 C、Objective-C 的边界

15 宏与调试

宏的两种形态与写法、@ 属性全表、怎么看宏展开,以及断言家族与调试输出的全部选项

16 血泪速查:最容易写错的地方

一份按症状索引的速查表:每一条都写清「你会怎么写」「实际发生什么」「正确写法」,全部在本机 Swift 6.4 实跑过

最后修改 September 20, 2026: 更新 (25684a4ed)