ChatGPT解决这个技术问题 Extra ChatGPT

带有“?”的 Swift 变量装饰(问号)和“!” (感叹号)

我知道在 Swift 中,所有变量都必须设置一个值,并且通过使用可选项,我们可以将一个变量设置为最初设置为 nil

我不明白的是,用 ! 设置变量是做什么的,因为我的印象是这“解包”了一个可选值。我认为这样做可以保证在该变量中有一个值可以解包,这就是为什么在 IBActions 上看到它使用的原因。

所以简单地说,当你做这样的事情时,被初始化的变量是什么:

var aShape : CAShapeLayer!

为什么/什么时候我会这样做?

在你检查了这个事实之后,你会这样做来告诉一个变量是 nt nil 。
我不认为这应该被标记为重复。 “什么是可选的?”与“两种类型的选项有什么区别?”不是同一个问题。这几乎就是这个问题
@Jiaaro 即使在那种情况下,也已经有很多关于可选、隐式展开的可选等的问题。你也可以参考这个:stackoverflow.com/questions/24272781/…
@JackWu 好的,但我很确定这个问题在被问到时不是重复的。 (例如,在您的示例之前整整一周被问到)
@Jiaaro你说得很好,我没有注意到这是旧的..也许应该将另一个标记为与这个重复..

J
Jiaaro

在类型声明中,! 类似于 ?。两者都是可选的,但 ! 是一个“implicitly unwrapped" optional”,这意味着您不必打开它来访问该值(但它仍然可以是 nil)。

这基本上是我们在 Objective-c 中已经拥有的行为。一个值可以是 nil,你必须检查它,但你也可以直接访问该值,就好像它不是可选的一样(重要的区别是,如果你不检查 nil,你会得到一个运行时错误)

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "Optional Int"
var y: Int? = 2

// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3

用法:

// you can add x and z
x + z == 4

// ...but not x and y, because y needs to be unwrapped
x + y // error

// to add x and y you need to do:
x + y!

// but you *should* do this:
if let y_val = y {
    x + y_val
}

从 The Swift Programming Language 的第 56 页开始,一个恰当命名的部分描述了隐式展开的选项。
@Caleb 我添加了一个链接到在线文档的相关部分,我在其中提到了隐式展开的选项:)
很好的信息,谢谢。总的来说,到目前为止,Swift 强加给我们的安全性很受欢迎,应该会产生更少的错误 :)。
@Jiaaro:非常感谢您的分享。通过上面的例子让用户完全理解! :)
我认为“这基本上是我们在objective-c中已经拥有的行为”这句话可能会令人困惑。在objective-c中,人们可以访问一个nil值并实际使用它,在swift中访问一个隐式展开的可选值,而它是nil 抛出一个运行时异常。