如果评估斯威夫特如何评估?

我已经看到了这个代码在Swift网站和各种职位在这里,我正在努力掌握的基本知识。 这条线是如何评估的?

if let name = optionalName { 

我很困惑,因为它不是名称==可选的名称,它的分配值,那么如何报告是真实的,为什么当你用nilreplace约翰appleseed是不正确的,因为它仍然是平等的?

 var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" } 

基本上这句话是这样说的:“如果你可以让新的variablesname等于optional的非可选版本,那就用它来做下面的事情。 正如马丁指出的,这被称为可选绑定 。

它的唯一目的是testing一个可选variables是否包含实际值,并将非可选forms绑定到一个临时variables。 这是“打开”一个可选的或换句话说,访问包含在可选项中的值的安全方式。 这绝不是对任何forms的平等的检验。 它只是在一个可选项中testing一个值的存在。

一个可选的要么是设定的要么是没有设定的……让我们做出一个重要的决定。 “我们应该如何编写我们的代码,使其能够在两种状态下正常工作?”。 我们打开可选的方式是为我们决定的。

有几种方法可以用来对付未设置的可选项。

  • 崩溃!
  • 如果未设置,则将该值默认为某个值。
  • 顺利地失败,即什么都不做,而且如果这个值已经设置好了,那就分配它。
  • 优雅地失败,但是, 如果值设置…做一些事情(这只是一个单一的任务)。

以下是4种方法


如果没有值,使用强制解包将会崩溃。 如果这个值是非常重要的,例如电影标题 (每部电影都必须有一个名字),你会想要这样做。 ! 用于强制解包。

 movieTitle = movie.title! 

使用零合并是另一种方式,可以给你更多的控制权 ,也就是说,如果没有设置值,它不会崩溃,如果没有设置,也不会“没有设置”…它会做你所说的如果没有名字设置,它会默认/设置电影名称为untitled_movie?? 用于零合并。

 var movieTitle = movie.title ?? "untitled_Movie" 

如果没有值,使用可选的链接将不会执行任何操作, 如果您有值,将会设置该值。 你这样做是因为一些有价值的东西,如你的演员代理人名字, 并不重要。 ? 用于可选的链接。

 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 (或者是两种不同types的可选绑定的 guard )会给你更多的控制 ,如果没有设置值,它不会崩溃。 如果这个值被设置,那么你可以做一些事情。 如果没有设置,那么你可以添加一个else语句。

 if let supportingActor = movie.supportingActor{ print(" The supporting actor is \(supportingActor)} 

这是解包的最常用的方式,因为强迫解包应该有些气馁。 有关更多的讨论,为什么不鼓励在这里看到。 对于guardif-let比较, 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* 

if语法接受2个不同的条件。 第二,一个可选的绑定,不是一个布尔值。 这是混乱,你可以写:

如果让name = optionalName {

但不是

if(let name = optionalName){

比较苹果文档(Swift参考):

if语句中任何条件的值必须具有符合BooleanType协议的types。 该条件也可以是可选绑定声明,如可选绑定中所述。

每当你使用弱引用,可选的types如果让我们安全地守护你的代码并避免崩溃,最好使用下面的例子

 var middleName :String? = "some thing" if let isExistsMiddleName = middleName { // do some thing here } else { // no middle name } 

if只使用布尔expression式,除了它会抛出一个错误,所以这段代码片断说

 if let name = optionalName { }else{ } 

如果optionalName为零,则条件为false,否则语句将执行。 但是,如果optionalName有一些值,那么可选值将被解包/分配到常量variables中,即名称。