我为什么要隐式解包未打开的可选项呢?

时间:2016-11-30 19:40:13

标签: swift

我无法理解字符串插值在Swift 3中是如何工作的。这里有两个变量,可选x和隐式解包的可选y

let x: Int? = 1
let y: Int! = 2

打印这两个选项看起来很合乎逻辑:

print(x) // Optional(1)
print(y) // 2

但为什么字符串插值以其他方式工作?

print("x: \(x)") // x: Optional(1)
print("y: \(y)") // y: Optional(2)

为什么要解开已经解开的可选项?

print("y: \(y!)") // y: 2

我们假设这里使用CustomStringConvertible协议,使用description属性将Int!转换为String。但为什么这里没有y: Optional(2)

print("y: \(y!.description)") // y: 2
print("y: \(y?.description)") // y: Optional("2")
print("y: \(y.description)")  // y: 2

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

print,作为其内部工作的一部分,展开了Optionals(常规的,解开自己的类型)。字符串插值不会为您执行此操作,它只会转换您提供的任何内容。

以下是对最后一个例子的解释:

  • print("y: \(y!.description)") // y: 2

    yInt!类型,明确解开,以提供其Int内容。 description被调用。 description会返回String。如果y为零,则会崩溃。

  • print("y: \(y?.description)") // y: Optional("2")

    可选链接用于description上的y,如果它是非零的。如果它是nil,则首先不会调用描述,并传播nil。此表达式的结果为String?

  • print("y: \(y.description)") // y: 2

    与案例1一样,yInt!开头,但这次是隐式解包,以提供其Int内容。 description被调用。 description会返回String。如果y为零,则会崩溃。