我无法理解字符串插值在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
有人可以解释一下吗?
答案 0 :(得分:1)
print
,作为其内部工作的一部分,展开了Optionals(常规的,解开自己的类型)。字符串插值不会为您执行此操作,它只会转换您提供的任何内容。
以下是对最后一个例子的解释:
print("y: \(y!.description)") // y: 2
y
有Int!
类型,明确解开,以提供其Int
内容。 description
被调用。 description
会返回String
。如果y
为零,则会崩溃。
print("y: \(y?.description)") // y: Optional("2")
可选链接用于description
上的y
,仅,如果它是非零的。如果它是nil
,则首先不会调用描述,并传播nil
。此表达式的结果为String?
。
print("y: \(y.description)") // y: 2
与案例1一样,y
以Int!
开头,但这次是隐式解包,以提供其Int
内容。 description
被调用。 description
会返回String
。如果y
为零,则会崩溃。