如何评估Swift IF LET?

Dea*_*ero 73 if-statement swift

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

if let name = optionalName {
Run Code Online (Sandbox Code Playgroud)

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

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

dre*_*wag 84

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

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

  • @Nuibb因为在使用`if let`时我们将值绑定到一个非可选变量(在本例中为`name`).你的例子不会编译,因为现在没有名为`name`的变量.如果您将示例更改为使用`optionalName`,它将打印为`Hello,Optional("John Appleseed")`.您可以在检查nil`Hello,\(optionalName!)`之后使用强制解包,但如果您在没有检查的情况下移动该部分代码,则这更容易出错. (3认同)
  • 当我开始阅读它时,我会阅读它,我只是在快速介绍的开始,它没有解释它。你的解释很有道理,谢谢。 (2认同)

Hon*_*ney 23

一个可选的是set或not-set(不是nil或nil)......给我们一个重要的决定."我们应该如何编写我们的代码,以便它能够在两个状态下正常工作?" 我们打开可选项的方式是为我们决定的.

有几种方法可用于对抗未设置的可选项.

  • 崩溃!
  • 默认值为某事 - 如果没有设置.
  • 优雅地失败,即什么也不做,但如果设置了值,则分配它.
  • 优雅地失败,即什么也不做,但是如果设置了值...做某事(它只是一个单独的任务).

以下是4种方法


如果您没有值,使用强制解包将崩溃.如果拥有该值至关重要,例如电影标题(每部电影必须有一个名字),你会想要这样做.用于强制展开. !

movieTitle = movie.title!
Run Code Online (Sandbox Code Playgroud)

使用nil合并是另一种可以让你获得更多控制权的方法,这意味着如果没有设置它就不会崩溃,如果没有设置它也不会"没有设置它"......它会按你所说的去做例如,如果没有设置名称,它将默认/设置电影名称为untitled_movie.??用于零合并.

var movieTitle = movie.title ?? "untitled_Movie"
Run Code Online (Sandbox Code Playgroud)

使用可选的链接不会做任何事情,如果你没有一个值,将设定值,如果你有一个值.你这样做的东西,其值设置不是至关重要的,例如你的演员的代理人名字.?用于可选链接.

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)  
Run Code Online (Sandbox Code Playgroud)

使用if-let(或guard两种不同类型的可选绑定)将为您提供更多控制,如果未设置该值,则不会崩溃.如果设置了值,那么您可以执行某些操作.如果未设置,则可以添加else语句.

if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
Run Code Online (Sandbox Code Playgroud)

这是最常用的展开方式,因为有些不鼓励强行展开.有关为何不鼓励的更多讨论请参见此处.对于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*
Run Code Online (Sandbox Code Playgroud)


小智 6

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

if let name = optionalName {
Run Code Online (Sandbox Code Playgroud)

但不是

if (let name = optionalName) {
Run Code Online (Sandbox Code Playgroud)

Apple文档(Swift 参考):

条件的值必须是类型Bool或桥接到 的类型Bool。条件也可以是可选绑定声明,如可选绑定中所述。