一个可选项是设置或未设置(不是 nil 或 nil)...留给我们一个重要的决定。 “我们应该如何编写我们的代码,以便它可以在两种状态下正常工作?”。我们解包可选的方式决定了我们的选择。
您可以使用多种方法来对抗未设置的可选项。
- 崩溃!
- 将值默认为某个值 — 如果未设置。
- 优雅地失败,即什么都不做,但也如果设置了值,然后分配它。
- 优雅地失败,即什么也不做,但是如果值已设置...做某事(它不仅仅是一个单一的任务)。
以下是四种方法
使用forced unwrapping 会崩溃如果你没有价值。如果具有该值至关重要,例如,您会想要这样做。 电影的标题(每部电影都必须有名字)。 ! 用于强制解包。
movieTitle = movie.title!
使用nil coalescing 是另一种为您提供更多控制权的方法,这意味着如果未设置该值,它不会崩溃,如果未设置,它也不会“不设置任何内容”设置......它会做你告诉它做的事情,例如如果没有设置名称,它将默认/设置电影的名称为 untitled_movie。 ?? 用于 nil 合并。
var movieTitle = movie.title ?? "untitled_Movie"
使用optional Chaining 将不会执行任何操作如果您没有值,并且会设置值如果您有一个值。你这样做是因为它的值集是不是至关重要的,例如你的演员的代理人的名字。? 用于可选链接。
let agent = movie.leadActor?.agent //would not crash if you don't have a lead actor (optional chaining)
let agent = movie.leadActor!.agent //would crash if you don't have a lead Actor (forced wrapping)
使用if-let(或guard,这是optional binding 的两种不同类型)将为您提供更多控制,如果未设置该值也不会崩溃。如果设置了值,那么你可以做一些事情。如果未设置,则可以添加 else 语句。
if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
这是最常用的展开方式,因为有些不鼓励强制展开。有关不鼓励使用它的原因的更多讨论,请参阅here。对于guard 和if-let 之间的比较,请参阅guard vs. if-let
旁注:
可选绑定和可选链接通常一起使用:
if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
} // if-let is the optional *binding* part, the movie dot leadActor dot is the optional *chaining*