Struct vs Class:地图复印 vs 谷歌文档
维度 | struct(值类型) | class(引用类型) |
---|---|---|
传递行为 | 复印一份 | 同一把钥匙 |
内存位置 | 栈(快) | 堆+ARC |
是否继承 | ❌ | ✅ |
举例 | Point 、String |
UIViewController |
swift
let a = Point(x: 1, y: 2) // struct
var b = a // 复印
b.x = 99 // 改复印本
print(a.x) // 原图仍是 1
生活类比:
- struct = 纸质地图复印 → 朋友圈圈点点不影响你那份。
- class = 谷歌文档 → 任何人改动实时同步。
闭包 Closures:外卖"到楼请打电话"
swift
let greet: (String) -> String = { "Hello, \($0)!" }
类比:下单外卖时写下的配送备注(闭包),骑手(系统)在到达时才执行;备注里可以"捕获"你房间号(上下文变量)。
Optional & ??
:礼物盒与备用名字
swift
var nickname: String? = nil
let screenName = nickname ?? "Guest"
三步记忆:
- 礼物盒(Optional)→ 可能有表,可能是空。
- 必须先打开(unwrap)才能用。
- 没礼物?用备用名字"Guest"------这就是
??
(Nil-Coalescing)。
Enum 带关联值:电影票附赠"隐藏彩蛋"
swift
enum Ticket {
case movie(name: String)
case concert(artist: String, seat: String)
}
let t = Ticket.movie(name: "奥本海默")
类比:票根(enum 值)本身告诉你活动类型,同时附带不同信息:电影→片名;演唱会→歌手+座位。一张票搞定所有场景,编译器还强制你穷尽处理所有 case,告别魔法字符串。
Protocol + 扩展:驾照+全国通用交规
swift
protocol Drivable {
var speed: Int { get set }
func drive()
}
extension Drivable {
func stop() { print("Stopped.") } // 默认实现
}
类比:
- 协议 = 驾照考试清单(必须会刹车、打灯)。
- 协议扩展 = 全国统一驾驶手册,不用再给每位司机重印一本。
Concurrency:服务员同时盯 N 桌
swift
Task {
let data = await fetchData() // 后厨做饭
updateUI(data) // 主线程上菜
}
类比:优秀服务员(系统)不会死等厨房,而是先去给别桌点单;菜好了异步回调再上菜,顾客(UI)始终流畅。
Error Handling:ATM 的友好提示
swift
enum ATMError: Error { case noCash; case invalidCard }
func withdraw(amount: Int) throws -> Cash {
guard amount <= balance else { throw ATMError.noCash }
return Cash(amount)
}
类比:卡被吞、余额不足,ATM 不会爆炸,而是亮出清晰提示;同理,Swift 用 do-try-catch
让程序优雅降级而不是闪退。
Access Control:公寓门禁等级
关键字 | 可见范围 | 类比 |
---|---|---|
open |
全宇宙可继承 | 小区大门,还能改规则 |
public |
全宇宙可见 | 小区花园,只能看不能改 |
internal (默认) |
同模块 | 住户层电梯 |
fileprivate |
同文件 | 自家客厅 |
private |
同作用域 | 卧室 |
一页速查表(保存到手机)
概念 | 关键字/示例 | 生活锚点 |
---|---|---|
值类型 | struct |
纸质地图复印 |
引用类型 | class |
谷歌文档 |
闭包 | { } |
外卖备注 |
空值处理 | ?? |
备用名字 |
枚举 | enum Case(let info) |
电影票附赠信息 |
协议 | protocol + extension |
驾照+通用手册 |
并发 | await / Task |
服务员多桌 |
错误处理 | do-try-catch |
ATM 提示 |
访问控制 | private...open |
公寓门禁 |