可选选项是设置的或未设置的(不是nil或nil)...让我们有一个重要的决定。“我们应该如何编写代码,使其在两种状态下都能正常工作?”。我们解包的方式可选项是为我们决定的。
您可以使用多种方法来对抗未设置的可选内容。
- 崩溃!
- 将值默认为某些值(如果未设置)。
- 优雅地失败,即什么也不做,但是如果设置了值,则进行分配。
- 正常失败,即不执行任何操作,但是,如果设置了该值,则执行某些操作(不止是一次分配)。
以下是4种方法
如果没有值,使用强制展开将导致崩溃。如果具有至关重要的价值,例如电影的标题(每部电影都必须有一个名称),则需要这样做。用于强制展开。!
movieTitle = movie.title!
使用nil合并是另一种可以给您更多控制的方法,这意味着如果未设置该值,则不会崩溃;如果未设置该值,则不会“不设置任何内容”……它将按照您的要求进行操作这样做,例如,如果未设置名称,它将默认/将电影名称设置为untitled_movie。??
用于零合并。
var movieTitle = movie.title ?? "untitled_Movie"
使用可选的链接不会做任何事情,如果你没有一个值,将设定值,如果你有一个值。您这样做的原因是,其价值设定并不是至关重要的,例如,对于演员代理人的名字而言。?
用于可选链接。
let agent = movie.leadActor?.agent
let agent = movie.leadActor!.agent
使用if-let
(或guard
这是两种不同类型的可选绑定)将为您提供更多控制权,如果未设置该值,则不会崩溃。如果设置了该值,则可以执行某些操作。如果未设置,则可以添加一条else
语句。
if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
这是最常用的解包方式,因为不鼓励使用强制解包。有关为什么不鼓励使用它的更多讨论,请参见此处。要在guard
和之间进行比较,if-let
请参见guard vs. if-let
边注:
可选绑定和可选链接通常一起使用:
if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
}