如何评估Swift IF LET?

时间:2014-09-13 22:23:18

标签: if-statement swift

我在Swift网站上看​​过这个代码,这里有各种帖子,我正在努力掌握基础知识。这条线如何评估?

if let name = optionalName {

我很困惑,因为它不是name ==可选名称,它正在分配值,所以报告的真实性如何 当你用nil替换john appleseed时,为什么不是这样,因为它仍然是平等的?

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

5 个答案:

答案 0 :(得分:79)

基本上该行说,“如果您可以让新变量name等于optionalName的非可选版本,请执行以下操作”。正如马丁指出的那样,这被称为Optional Binding

它的唯一目的是测试可选变量是否包含实际值并将非可选形式绑定到临时变量。这是“解包”可选项的安全方法,换句话说,访问可选项中包含的值。它决不会测试任何类型的平等。它仅测试可选项中是否存在值。

答案 1 :(得分:22)

可选是设置或未设置(不是零或零)......让我们做出重要决定。 “我们应该如何编写我们的代码,以便它能够在两个状态下正常工作?”我们解开可选项的方式是我们的决定。

您可以使用多种方法来对抗未设置的可选项。

  • 崩溃!
  • 默认值为某物 - 如果未设置。
  • 正常失败即无所事事,但如果设置了值,则分配它。
  • 优雅地失败,即不做任何事情,但如果设置了值...做某事(它只是一次分配)。

以下是4种方法

使用forced unwrapping会导致崩溃,如果您没有值。如果具有该值至关重要,您可能希望这样做,例如电影的标题(每部电影必须有一个名字)。 !用于强制解包。

movieTitle = movie.title!

使用nil coalescing是另一种可以提供更多控制权的方式,这意味着如果未设置该值,它不会崩溃,如果没有设置它也不会“它没有设置......它会做你告诉它做的事情,例如如果没有设置名称,它会默认/设置电影的名称为untitled_movie ??用于零合并。

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)会为您提供更多控制,如果值为n,则不会崩溃不定。如果设置了值,那么您可以执行某些操作。如果未设置,则可以添加else语句。

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

这是最常用的展开方式,因为有些不鼓励强行打开。有关为何不鼓励的更多讨论,请参阅here。要在guardif-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*

答案 2 :(得分:4)

if语法接受2种不同的条件。第二个是可选绑定,不是布尔值。这很令人困惑,你可以写:

if let name = optionalName {

但不是

if (let name = optionalName) {

Apple documentation(Swift参考):

  

条件的值必须是Bool类型或桥接类型   到Bool。条件也可以是可选的绑定声明,   正如Optional Binding中讨论的那样。

答案 3 :(得分:2)

if只接受布尔表达式,除了它会引发错误,所以这段代码片段说

if let name = optionalName {

}else{

}

如果optionalName为nil,则条件为false,否则将执行语句。但是,如果optionalName具有某个值,则可选值将被解包/分配到常量变量,即名称。

答案 4 :(得分:1)

每当您使用弱引用,可选类型时,如果让安全保护您的代码并避免崩溃,最好使用 以下是示例

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