我知道可选链就像:
if let name = student.info?.name {
// if student has info & info contains name, it comes here.
}
问题:
1。但是,执行上述操作与执行以下操作之间有什么区别:
let name = student.info?.name
如果let name
没有student
或info
不包含info
,那么name
是否为零?
2。如果info
不包含name
以下代码,应用会发生什么情况:
var student: Student? {
didSet {
// 'nameLabel' is an outlet for UILabel
nameLabel.text = student.info?.name
}
}
如果student
没有设置info
或info
设置name
变量时student
没有设置<canvas #myCanvas id="mermaidJS"></canvas>
// Component
@ViewChild('myCanvas'): ElementRef;
,那么将在以上情况下崩溃吗?
答案 0 :(得分:1)
可选链接意味着您可以安全地检查嵌套选项的值。如果链中的任何选项为nil
,则不会进一步检查值,整个链的返回值变为nil
。您需要在可选链中使用?
字符标记所有可选值,而不仅仅是最后一个,在您的问题中,您只标记了最后一个可选值。
您问题中的代码实际上不会编译,因为在访问可选项的属性时,您需要强行打开它或使用可选链接。
student!.info?.name
编译,但如果student == nil
导致运行时崩溃。 student?.info?.name
编译并且不会导致崩溃,但如果nil
或student == nil
,则会返回student?.info ==
nil
。 student.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)
答案 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
不是一个可选项,因为原来的
答案 4 :(得分:0)
?
标记,就像打开披萨盒一样,看看里面是否有披萨。
比萨饼盒,是可选变量。 (包含?
的变量,例如var student: Student?
)
披萨是学生自己的对象。
假设您要访问name
的{{1}}。就像你想要披萨披萨一块披萨一样。因为披萨是在一个盒子里,你必须先打开盒子,与可选变量一样,要访问它的成员,你必须先打开它。
但等等,当你打开披萨盒时,里面没有披萨,当然你也不能吃你想吃的切片披萨。同样可以应用于var student
,因为它是可选的,在您打开它之后,它可以为空(var student
)。
这就是为什么如果您有nil
,并且想要从var student: Student?
访问name
,则必须先使用student
然后再打开student?
您要访问的成员student?.name
。当然,如果学生为nil
,则返回值为nil
。
问题1
if let
与let
之间的区别是什么,if let
是否有条件询问框中的对象是否存在?如果有对象,那就这样做。
if let name = student?.name {
print(name)
}
从上面的代码中,如果student
不是nil
而只是说var name
包含joe
,则会打印joe
。但是,如果student
为nil
,那么print(name)
永远不会被执行。
let name = student?.name
print(name)
上面的代码,删除if
语句,所以这不是询问对象是否存在,但无论对象是否存在,它都需要一些东西。因此,如果student
为nil
,name
当然会返回nil
,我们会在调试视图中打印nil
。
问题2
您应首先查看nameLabel.text
是否可选。我们可以从您的代码中看到student
是可选的,但我们不知道.text
是否是可选的。将可选项分配给可选项绝不是问题。如果变量为nil
,则分配的变量也会变为nil
。
但是如果你将一个可选项分配给一个非可选变量,那么swift编译器会告诉你你不能这样做,因为如果可选变量是nil
那么非可选变量会崩溃,因为它不能nil