当我从Objective-C
更改为Swift
编程时,我遇到了!
' (感叹号)和' ?
' (问号)通常必须在property
,method
电话等之后立即放置。这些标记用于什么,如果我们不使用它们会发生什么?
我在网上搜索了一个彻底的答案,却找不到任何答案。所以我决定把答案放在这里,以防任何人为此寻找明确答案。
我在下面的答案中也包含了一个类似于我的问题的链接,您可以在其中找到有关如何以及在何处使用这些标记的进一步说明(即'!'和' 39;')。我的问题和我的答案在比基本链接中的类似问题更基本的层面上进行了解释。
答案 0 :(得分:1)
用于这些标记的术语是Optional Chaining
。它们通常用于区分案例,例如,property
是否method call
是否返回nil
。
Apple's language guide for Optional Chaining
中解释的一个例子很好地说明了它们的用途:
首先,定义了两个名为
Person
和Residence
的类:class Person { var residence: Residence? } class Residence { var numberOfRooms = 1 } Residence instances have a single `Int` property called `numberOfRooms`, with a default value of **1**. `Person` instances
是否有
residence
类型的可选Residence
属性?如果您创建新的
Person
实例,则其residence
属性为 由于是可选的,默认值已初始化为nil
。在代码中 在下方,john
的{{1}}属性值为residence
:nil
如果您尝试访问此人的
let john = Person()
财产numberOfRooms
,在residence
之后添加感叹号 强制解包其值,触发运行时错误, 因为没有residence
值要解包:residence
当
let roomCount = john.residence!.numberOfRooms // this triggers a runtime error
具有非零值时,上面的代码会成功 并将john.residence
设置为包含相应值的roomCount
值 房间的数量。但是,此代码始终会触发运行时Int
为residence
时的错误,如上所示。可选链接提供了一种访问其值的替代方法
nil
。要使用可选链接,请使用问号 感叹号的位置:numberOfRooms
这告诉Swift在可选的
if let roomCount = john.residence?.numberOfRooms { print("John's residence has \(roomCount) room(s).") } else { print("Unable to retrieve the number of rooms.") } // Prints "Unable to retrieve the number of rooms."
属性上“链” 如果residence
存在,则检索numberOfRooms
的值。因为访问
residence
的尝试有可能发生 失败,可选的链接尝试返回类型numberOfRooms
的值,或 “可选的Int ”。当Int?
为residence
时,如示例中所示 在上面,这个可选的nil
也将是Int
,以反映这一事实 无法访问nil
。可选numberOfRooms
通过可选绑定访问以解包整数并分配Int
变量的非可选值。请注意,即使
roomCount
是 nonoptional ,也是如此numberOfRooms
。通过可选链条查询它的事实 对[{1}}的调用将始终返回Int
numberOfRooms
。您可以将
Int?
个实例分配给Int
,以便它 不再具有Residence
值:john.residence
除了上面的可选链接的一般概述,您可以在StackOverflow中查看此answer。
希望这能为您提供有关可选链接的一些观点。
答案 1 :(得分:1)
简单来说,添加
!
意味着你100%保证给出一个值......如果你添加一个"!"并且没有给出应用程序崩溃的值,说返回的值为零(或类似的东西)......
?
意味着您可能会返回一个值......如果您可以帮助它,这是更好的做事方式......