1.1 舞台搭建:从Xcode到第一句台词


1.1 舞台搭建:从 Xcode 到第一句台词

本节摘要:本节是全书的第一站——把开发环境搭好,跑通第一段 Swift 代码,并拆开"按下运行键"之后编译器做的事。读完你能独立完成从安装 Xcode、新建 Playground 到看见第一行输出,并说清审阅、翻译、链接、上机这四步编译流水线。

这是序幕的第一站,负责整座剧场的地基:后面每一节的代码,都要在你此刻搭好的舞台上跑。

现场还原:第一天的拾光影院

假设你就是拾光影院 App 的第一位工程师。入职第一天,产品经理只提了一个需求:先在屏幕上打出一行字,证明这条流水线是通的。听起来简单,但这件事要穿过四层机械:你的代码先被编译器审阅,再被翻译成中间码,然后链接上 Apple 的框架,最后部署到模拟器上执行。本节就把这四层拆开看。

Swift 是 Apple 在 2014 年推出的编程语言,2015 年开源,用来取代服役了三十多年的 Objective-C。它有几条贯穿全书的性格:类型安全(不合法的组合在编译期就被拦下)、可选值显式化("没有值"必须写出来)、以及值语义优先(集合和结构体默认是复制的,不是共享的)。这些性格在本章后两节会一一登场,现在先让它们亮个相。

第一行台词

在 Xcode 里新建一个 Playground(Xcode 启动页选 Playground,模板取 Blank),敲下面这段——它模拟了排片界面开机时打印的第一串日志:

// 拾光影院 · 排片界面的第一行台词 let appName = "拾光影院" // 常量:App 名字不会中途改变 var sessionCount = 0 // 变量:场次数会随加载变化 print("欢迎来到 \(appName)") // 字符串插值:把值嵌进文案 print("当前场次:\(sessionCount)") // 输出:当前场次:0 sessionCount = 42 // 变量可以被重新赋值 print("加载后场次:\(sessionCount)") // 输出:加载后场次:42

Playground 右侧会即时显示每行的结果,这就是 Swift 的第一特性:写一行,看一行。把 appName = "别的" 加到末尾试试,编译器立刻标红——常量一旦登记,终身不改。这个报错不是刁难,是剧本审阅在替你挡事故:如果界面各处都以为 App 叫"拾光影院",中途改名的后果就是各说各话。

换个登台方式:REPL 与命令行会话

除了 Playground,Swift 还有一个更轻的登台口——REPL(交互式解释器)。在终端输入 swift 回车,就能逐句对话:

$ swift Welcome to Apple Swift version 5.9 1> let film = "星际列车" film: String = "星际列车" 2> let minutes = 142 minutes: Int = 142 3> print("《\(film)》片长 \(minutes) 分钟") 《星际列车》片长 142 分钟 4> :

REPL 每接受一句,就回报它的类型与值:film 被推断为 String,minutes 被推断为 Int。这个"你给初值,我记类型"的机制叫类型推断,是 1.2 节的主角。REPL 适合验证一行语法的直觉;Playground 适合试验几十行的片段;真工程则在 Xcode 工程里组织。三种登台方式,规模递增。

第二场:按下运行键之后发生了什么

在 Xcode 里新建一个 iOS App 工程(模板选 App,Interface 选 SwiftUI),把上面几行代码放进最外层,按 Cmd+R。屏幕亮起之前,流水线其实走了四步。

第一步:审阅与解析。 编译器逐字符读你的源码,检查语法与类型——括号是否配对、常量是否被改、可选值是否被裸用。你在编辑器里看到的红色感叹号,几乎都来自这一步。

第二步:翻译成中间码。 语法过关的代码被转成 SIL(Swift 中间语言),再降为 LLVM 中间表示。优化(比如把没用的计算剔除)发生在这里。

第三步:链接。 你的代码引用了 Apple 提供的框架(打印要用到的底层能力就住在里面),链接器把这些库与你的机器码拼成同一个可执行文件。

第四步:上机。 模拟器(或真机)启动这个可执行文件,操作系统为它分配内存,main 入口开始执行,界面这才出生。

从源码到舞台的流水线

从源码到舞台的流水线

⚠️ 常见坑:初学者看到满屏红色报错就清空重来。更好的做法是读第一条报错——后面的报错常是第一条的连锁反应。修一条,看一眼,再修下一条。

第三场:给流水线装上仪表

Xcode 不只是编辑器,它是剧场的总控台。第一次打开工程,值得先认识四个区域:左侧导航器(文件与符号的树)、中间编辑区(剧本纸)、右侧检查器(当前选中对象的属性)、底部调试区(运行时的日志与变量监视)。本节只需要用到导航器和调试区:按 Cmd+R 运行后,调试区会打印你在模拟器上触发的所有日志。

用一个最小实验验证整条流水线。在 SwiftUI 工程里找到 App 入口结构体,在它的初始化附近放一句打印:

import SwiftUI @main struct LighthouseCinemaApp: App { // 程序的出生证明:进程启动后最先执行的自定义代码之一 init() { print("拾光影院进程启动,准备创建排片界面") } var body: some Scene { WindowGroup { Text("拾光影院") // 舞台上此刻只有一行字 } } }

运行后调试区出现"拾光影院进程启动,准备创建排片界面",模拟器屏幕中央显示"拾光影院"。这两行输出分别来自流水线的第 4 步(代码执行)与你声明的界面描述。变式练习:把 print 那行改成 print(42),运行——日志变成 42;再试着把 Text("拾光影院") 改成 Text(appName)(appName 已删的话重新声明一个常量),体会"界面内容来自数据"这一事实。第7章会把这句话展开成 SwiftUI 的完整世界观。

💡 关键直觉:Xcode 的运行键不是"保存并打开",而是一次完整的"审阅—翻译—链接—部署"。理解了这一点,你对报错时机的预期就会准:语法错误在写代码时就被标出,链接错误在运行前一刻才爆,运行时崩溃则是上了舞台才炸的最后一类。

谢幕笔记

  • Swift 的定位:Apple 平台的现代语言,类型安全、可选值显式、值语义优先,三条性格贯穿全书;
  • 三种登台方式:REPL 验证单句、Playground 试验片段、Xcode 工程承载真实 App,按规模选用;
  • 四步流水线:审阅解析、翻译成中间码、链接、上机执行;报错出现的时机能反推它出在哪一步;
  • let 与 var 的第一次见面:默认用 let,确需改变才用 var,这条习惯会减少大量状态混乱;
  • 总控台四区:导航器、编辑区、检查器、调试区,本节用到其中两个,其余在终幕第8章补全。

下一站往登记处走:1.2 节把"角色"一个个登记进类型系统——变量、常量、类型推断,以及那位特殊的、允许"暂时缺席"的可选值。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U