什么是'!'和'?' Swift中使用的标记

时间:2016-05-20 09:21:49

标签: swift2.2 optional-chaining

当我从Objective-C更改为Swift编程时,我遇到了!' (感叹号)和' ?' (问号)通常必须在propertymethod电话等之后立即放置。这些标记用于什么,如果我们不使用它们会发生什么?

我在网上搜索了一个彻底的答案,却找不到任何答案。所以我决定把答案放在这里,以防任何人为此寻找明确答案。

我在下面的答案中也包含了一个类似于我的问题的链接,您可以在其中找到有关如何以及在何处使用这些标记的进一步说明(即'!'和' 39;')。我的问题和我的答案在比基本链接中的类似问题更基本的层面上进行了解释。

2 个答案:

答案 0 :(得分:1)

用于这些标记的术语是Optional Chaining。它们通常用于区分案例,例如,property是否method call是否返回nil

Apple's language guide for Optional Chaining中解释的一个例子很好地说明了它们的用途:

  

首先,定义了两个名为PersonResidence的类:

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值   房间的数量。但是,此代码始终会触发运行时   Intresidence时的错误,如上所示。

     

可选链接提供了一种访问其值的替代方法   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%保证给出一个值......如果你添加一个"!"并且没有给出应用程序崩溃的值,说返回的值为零(或类似的东西)......

?

意味着您可能会返回一个值......如果您可以帮助它,这是更好的做事方式......