关于可选的链条使用和app的相应后果

时间:2017-09-06 14:33:35

标签: swift

我知道可选链就像:

if let name = student.info?.name {
  // if student has info & info contains name, it comes here.
}

问题:

1。但是,执行上述操作与执行以下操作之间有什么区别:

let name = student.info?.name

如果let name没有studentinfo不包含info,那么name是否为零?

2。如果info不包含name以下代码,应用会发生什么情况:

var student: Student? {
    didSet {
         // 'nameLabel' is an outlet for UILabel
        nameLabel.text = student.info?.name
    }
}
如果student没有设置infoinfo设置name变量时student没有设置<canvas #myCanvas id="mermaidJS"></canvas> // Component @ViewChild('myCanvas'): ElementRef; ,那么

将在以上情况下崩溃吗?

5 个答案:

答案 0 :(得分:1)

可选链接意味着您可以安全地检查嵌套选项的值。如果链中的任何选项为nil,则不会进一步检查值,整个链的返回值变为nil。您需要在可选链中使用?字符标记所有可选值,而不仅仅是最后一个,在您的问题中,您只标记了最后一个可选值。

您问题中的代码实际上不会编译,因为在访问可选项的属性时,您需要强行打开它或使用可选链接。 student!.info?.name编译,但如果student == nil导致运行时崩溃。 student?.info?.name编译并且不会导致崩溃,但如果nilstudent == nil,则会返回student?.info == nilstudent.info?.name无法编译,因为您根本不打开可选的student变量。

这是可选绑定,在大多数情况下,当您需要使用可选值时,应该使用它。

if let name = student?.info?.name {
  //name is non-optional here, so it can safely be used inside the if statement
}

如果使用不带可选绑定的可选链接,则变量类型也是可选的:

let name = student?.info?.name //name is optional here

对于您的上一个问题,didSet被调用的事实并不意味着student不是nil。实际上,每次为属性赋值时都会调用属性观察者,并且由于student是可选的,nil是有效值,因此student可以是nil在属性观察者里面。此外,即使student具有非零值这一事实也不能保证student.info也具有非零值。但是,由于UILabel.text的类型为String?,因此为其指定nil值并不会导致崩溃,除非您稍后强行解包nameLabel.text

var student: Student? {
    didSet {
         // 'nameLabel' is an outlet for UILabel
        nameLabel.text = student?.info?.name
    }
}

有关详细信息,请查看The Swift Programming Language Guide - Optionals部分。

答案 1 :(得分:0)

  1. 如果info属性为nil,则name将变为nil。否则将为name分配info的name属性。 结论,“name”取决于info属性,而不是info.name属性。
  2. 应用程序不会崩溃,因为UILabel.text属于可选类型。如果info为nil,则text为nil,否则为info.name。

答案 2 :(得分:0)

如果您尝试访问未定义的对象中的变量,您的应用程序将崩溃。

如果info不是可选的但名称是,那么它将在nameLabel.text中放入nil值,但是你的例子肯定会崩溃。 你似乎知道如何处理这个,但我会为此添加一个解决方案:

var student: Student? {
    didSet {
        if let studentInfo = student.info {
            nameLabel.text = studentInfo.name
        } else {
            nameLabel.text = "unknown"
        }
    }
}

答案 3 :(得分:0)

if let name = student.info?.name {
     

但是,做以上操作和执行以下操作之间有什么区别:

let name = student.info?.name

巨大的差异。

  • 第二个延续选项:name仍然是一个可选项,你仍然有安全展开它的问题,即如果恰好是{{ {1}}。

  • 第一个删除选项:如果我们深入花括号,nil 是一个可选项,因为原来的 em >已安全包裹。

答案 4 :(得分:0)

?标记,就像打开披萨盒一样,看看里面是否有披萨。

比萨饼盒,是可选变量。 (包含?的变量,例如var student: Student?) 披萨是学生自己的对象。

假设您要访问name的{​​{1}}。就像你想要披萨披萨一块披萨一样。因为披萨是在一个盒子里,你必须先打开盒子,与可选变量一样,要访问它的成员,你必须先打开它。

但等等,当你打开披萨盒时,里面没有披萨,当然你也不能吃你想吃的切片披萨。同样可以应用于var student,因为它是可选的,在您打开它之后,它可以为空(var student)。

这就是为什么如果您有nil,并且想要从var student: Student?访问name,则必须先使用student然后再打开student?您要访问的成员student?.name。当然,如果学生为nil,则返回值为nil

问题1

if letlet之间的区别是什么,if let是否有条件询问框中的对象是否存在?如果有对象,那就这样做。

if let name = student?.name {
    print(name)
}

从上面的代码中,如果student不是nil而只是说var name包含joe,则会打印joe。但是,如果studentnil,那么print(name)永远不会被执行。

let name = student?.name
print(name)

上面的代码,删除if语句,所以这不是询问对象是否存在,但无论对象是否存在,它都需要一些东西。因此,如果studentnilname当然会返回nil,我们会在调试视图中打印nil

问题2

您应首先查看nameLabel.text是否可选。我们可以从您的代码中看到student是可选的,但我们不知道.text是否是可选的。将可选项分配给可选项绝不是问题。如果变量为nil,则分配的变量也会变为nil

但是如果你将一个可选项分配给一个非可选变量,那么swift编译器会告诉你你不能这样做,因为如果可选变量是nil那么非可选变量会崩溃,因为它不能nil