01 起步与运行方式
Swift 代码的五种跑法、源文件的五个零件、常用编译选项与报错速查
7 分钟阅读
这不是教程,是字典。教程教你走路,字典只在你卡住时递上一根拐杖。所以本页写得密、写得短、写得没什么耐心——每一条都假设你已经会编程,只是记不清 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 和那些「先装 SDK 再看文档」的语言不太一样:只要有 Xcode 或官方工具链,命令行里敲一个 swift 就能进交互模式。
| |
| |
print 默认会换行。不想换行就传 terminator:
| |
Swift 擅长这些事
async/await、actor、Sendable 都由编译器做检查,“数据竞争"在 Swift 6 里是编译错误而不是线上事故。@ViewBuilder 就是靠这套东西做到的)。你可能会嫌它烦的地方
String 的索引不是整数,刚上手会觉得处处别扭——但它是对的,见 03 类型与字符串。macOS
xcode-select --install,或者用 swiftly 管理多套工具链。Linux
Windows 🚧
| |
| 场景 | 推荐 | 说明 |
|---|---|---|
| Apple 平台开发 | Xcode | SwiftUI 预览、Instruments、模拟器,一步到位 |
| 跨平台 / 服务端 | VS Code + Swift 扩展 | 底层就是 SourceKit-LSP,配合 SwiftPM 用着很顺 |
| JetBrains 用户 | VS Code / CLion 的 Swift 插件 🚧 | AppCode 已停止维护,CLion 插件仍在跟进 |
| 只想试几句 | swift repl 或 SwiftFiddle | 不用装任何东西 |
三条建议,按重要性排序:
$0 简写」——这页最值钱的东西都藏在那里。💭 已经出事了(崩溃、结果不对、编译莫名其妙不过)?别从头翻,直接去 16 血泪速查——那一章是按症状索引的,每条都写着"你会怎么写 / 实际发生什么 / 正确写法"。
💭 如果你想要系统学一遍而不是速查,隔壁的 Swift 基础部分 是按学习顺序写的教程;本目录负责在你忘了怎么写的时候救急。
同一份"打印问候语"的功能,在不同工程形态下的最小骨架不太一样。搞混了会觉得 Swift 到处是规矩,其实只是入口不同。
| |
| |
也可以在文件头加 shebang,直接当可执行文件跑:
| |
| |
| |
不想用 main.swift,也可以在任何文件里写 @main:
| |
⚠️ 用 swiftc 直接编单个文件时,这个文件会被当成"允许顶层代码的入口",@main 反而报错。想单文件验证,加 -parse-as-library:
| |
SwiftPM 里不用管这条,因为包里的文件本来就不是按"入口脚本"编的。
App 的入口不是 main 函数,而是一个带 @main 的类型:
| |
UIKit 老写法里还有 @UIApplicationMain 和 application(_:didFinishLaunchingWithOptions:),新项目基本不用了。🝖
| |
库没有入口,只有 public 才能被外部看到。想看这一块的全部细节,去 13 工具链与工程。
Swift 里"版本"有四个互不相同的含义,网上的报错信息经常把它们混着说:
| 概念 | 例子 | 影响什么 |
|---|---|---|
| 工具链版本 | Swift 6.4 | 你能用哪些语法、编译器有哪些新检查 |
| 语言模式 | -swift-version 6 | 是否启用严格并发检查、Sendable 违规是警告还是错误 |
| 部署目标 | iOS 26 / macOS 26 | 什么 API 能直接调用,什么必须 if #available |
| 包版本 | swift-tools-version: 6.2 | Package.swift 能写哪些清单 API |
| |
⚠️ 语言模式不是工具链版本。用 Swift 6.4 的工具链,依然可以把某个 target 设成 Swift 5 语言模式,此时并发相关的严格检查会退化成警告。
| 资料 | 链接 | 什么时候用 |
|---|---|---|
| The Swift Programming Language | docs.swift.org | 语言语义的权威答案 |
| Swift Standard Library | developer.apple.com/documentation/swift | 查具体 API 签名 |
| Swift Evolution | swift-evolution | 想知道某个语法是哪版加的、为什么这么设计 |
| Swift.org 博客 | swift.org/blog | 新版本特性解读 |
| Swift Forums | forums.swift.org | 官方团队会下场回答的社区 |
Swift 代码的五种跑法、源文件的五个零件、常用编译选项与报错速查
常量与变量、运算符优先级、控制流、let 绑定语法全表与模式匹配
整数与浮点的边界、Character 与 String 的全部写法、正则、格式化
数组、字典、集合、元组、区间的全部常用操作,附复杂度与陷阱
参数标签、可变参数、inout、闭包简写、捕获列表与 @escaping 的完整速查
T? 的本质、五种解包方式、可选链、?? 与 map/flatMap 的完整用法
结构体、类、枚举、actor 的选择,初始化器家族,属性与下标的全部形态
协议、关联类型、主关联类型、some 与 any、协议扩展与自动合成的完整速查
throws / try / Result 与 async / await / actor / Sendable 的完整速查
值传递还是引用传递、写时复制、独占访问、ARC 与循环引用、不可复制类型与内存布局
常用协议、格式化、Codable、KeyPath、结果构建器与日期时钟的速查表
同一段代码的完整写法与简写并排看:闭包、可选值、属性、初始化器、协议与 DSL
swift / swiftc / SwiftPM 命令表、Package.swift 模板、Swift Testing 与条件编译
is / as / as? / as! 的分工、Any 与元类型、Mirror 反射,以及与 C、Objective-C 的边界
宏的两种形态与写法、@ 属性全表、怎么看宏展开,以及断言家族与调试输出的全部选项
一份按症状索引的速查表:每一条都写清「你会怎么写」「实际发生什么」「正确写法」,全部在本机 Swift 6.4 实跑过