可选链 ?. 运算符
在不导致程序崩溃的情况下调用可选值上的方法并访问其属性
可选链 ?. 运算符 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
可选值链式调用允许您安全地通过可选值链调用方法、访问属性和使用下标。如果链中的任何一环为 nil,整个表达式都会返回 nil,而不会崩溃。
?. 运算符
```swift
struct Address { var city: String }
struct Person { var address: Address? }
let alice = Person(address: Address(city: "Istanbul"))
let bob = Person(address: nil)
print(alice.address?.city) // Optional("Istanbul")
print(bob.address?.city) // nil
```
链接多个层级
链式调用可以有任意深度:
```swift
struct Company { var ceo: Person? }
let company = Company(ceo: alice)
let city = company.ceo?.address?.city
print(city ?? "Unknown") // "Istanbul"
```
如果 `ceo` 或 `address` 为 nil,`city` 就会变为 nil。
通过链式调用方法
也可以通过可选值链式调用方法:
```swift
var name: String? = "alice"
let upper = name?.uppercased()
// Optional("ALICE")
name = nil
let upper2 = name?.uppercased()
// nil
```
返回类型会变为可选类型:`String` 会变成 `String?`。
通过链式调用使用下标
```swift
var dict: [String: [Int]]? = ["scores": [10, 20, 30]]
let first = dict?["scores"]?[0]
// Optional(10)
dict = nil
let none = dict?["scores"]?[0]
// nil
```
在链式调用中,下标的工作方式与属性和方法相同。
链式调用会产生可选值
即使最终结果是非可选值,链式调用也会将其包装为可选值:
```swift
struct Cat { var lives: Int = 9 }
var cat: Cat? = Cat()
let lives = cat?.lives // Int? not Int
```
请根据需要使用 `??`、`if let` 或 `guard let` 进行解包。
通过链式调用设置值
您可以通过可选链设置属性:
```swift
var profile: UserProfile? = UserProfile()
profile?.name = "Alice"
```
如果 `profile` 为空,赋值会被静默忽略,不会发生崩溃。
通过链式调用调用无返回值方法
```swift
var manager: SoundManager?
manager?.play() // silently ignored if nil
```
调用会返回 `Void?`:如果不为空,则返回 `()`;如果可选值为空,则返回 `nil`。您可以检查结果,以确定调用是否实际发生。
可选链与强制解包
```swift
// Forced unwrap — crashes if nil:
let city = alice.address!.city
// Optional chaining — safe:
let city = alice.address?.city
```
请始终优先使用可选链。只有在确定不会出现空值时,才使用 `!`。
结合 ?? 提供默认值
您可以在可选链之后连接 `??`,以简洁地提供默认值:
```swift
let displayCity = user.profile?.address?.city ?? "Unknown City"
let count = database?.records?.count ?? 0
```
整个链式调用要么解析为一个值,要么回退到默认值。
快速检查
如果可选链中的任一环节是 `nil`,整个表达式会返回什么?
回顾
要点总结:
• `?.` 可以安全地访问属性、调用方法以及对可选值使用下标
• 如果任一环节为空,整个链式调用都会返回空值
• 结果类型始终是可选类型,即使最终值通常不是可选值
• 将 `?.` 与 `??` 结合使用,可以简洁地实现安全访问和默认值处理
• 优先使用 `?.` 而不是 `!`,以避免崩溃
下一课:隐式解包可选值。
常见问题解答
「可选链 ?. 运算符」课时是免费的吗?
是的 — 「可选链 ?. 运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「可选链 ?. 运算符」这节课中我会学到什么?
在不导致程序崩溃的情况下调用可选值上的方法并访问其属性 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「可选链 ?. 运算符」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。