【问题标题】:What are '!' and '?' marks used for in Swift什么是'!'和 '?'用于 Swift 的标记
【发布时间】:2016-09-17 11:48:32
【问题描述】:

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

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

我还在我的答案下方提供了一个与我的问题类似的问题的链接,您可以在其中找到有关如何以及在何处使用这些标记(即“!”和“?”)的进一步说明。与链接中的类似问题相比,我提出的问题和我的回答在更基本的层面上进行了解释。

【问题讨论】:

标签: swift2.2 optional-chaining


【解决方案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,因为它是可选的。在代码中 下面,johnresidence 属性值为 nil

let john = Person()

如果您尝试访问此人的 numberOfRooms 属性 residence,在residence 之后放置感叹号 强制解包它的值,你会触发 运行时错误, 因为没有要解包的residence 值:

let roomCount = john.residence!.numberOfRooms
// this triggers a runtime error

john.residence 具有非nil 值时,上述代码成功 并将roomCount 设置为包含适当的Int 值 房间的数量。但是,此代码始终会触发 运行时 当residencenil 时出现错误,如上图所示。

可选链提供了一种访问值的替代方法 numberOfRooms。要使用可选链接,请在 感叹号的位置:

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."

这告诉 Swift 在可选的 residence 属性上“chain” 如果存在residence,则检索numberOfRooms 的值。

因为访问 numberOfRooms 的尝试可能会 失败,可选的链接尝试返回 Int? 类型的值,或者 “可选整数”。当residencenil 时,如示例 上面,这个可选的Int也将是nil,以反映事实 无法访问numberOfRooms。可选的Int 通过可选绑定访问以解包整数并分配 roomCount 变量的非可选值。

请注意,即使numberOfRooms 是一个非可选,这也是正确的 Int。通过可选链查询它的事实意味着 对numberOfRooms 的调用将始终返回Int? Int.

您可以将Residence 实例分配给john.residence,以便它 不再有 nil 值:

john.residence = Residence()

除了上面对可选链接的一般概述之外,您还可以查看 StackOverflow 中的 answer

希望这能让您对可选链有所了解。

【讨论】:

    【解决方案2】:

    简单地说,添加一个

    !
    

    表示您 100% 保证给出一个值....如果您添加一个“!”并且不要给出应用程序会崩溃的值,说返回的值是 nil(或类似的值).....

    ?
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2012-01-04
      • 2019-09-16
      • 2011-01-18
      相关资源
      最近更新 更多