为什么用值nil隐式展开的可选变量,而不是不打印,则输出nil?

时间:2019-04-30 08:23:53

标签: swift

为什么隐式解开的可选值为nil而不打印CRIL而不是CRASH? 应该崩溃,不打印“ nil”

    var x : Int!

    print(x) //nil

2 个答案:

答案 0 :(得分:2)

这不会崩溃,因为print接受Any作为第一个参数。隐式展开的可选内容是Any的一种吗?对,他们是!任何东西都是Any。无需解开可选项。可以在预期Any的情况下使用隐式解包的可选选项,而无需解开可选选项。

这可能会造成混淆,因为现在您有了类型为Any的东西,它看起来好像不是可选的,但实际上是可选的。为避免这种情况,Swift将输出警告,告诉您您正在隐式强制将任何可选类型强制为Any

您需要使用!强制在此处将其拆开:

print(x!)

答案 1 :(得分:0)

之所以不会崩溃,是因为您没有在print(x)中对其进行强制展开。它只会使您尝试像print(x!)

IUO(Implicitly Unwrapped Optionals)只是Optional的一种特殊类型,当您在链接(例如,可选链)中使用它时,它将自动解包,否则它们仍然是Optionals。

考虑一个示例:

var implicitlyUO: Int!
implictlyUO = 4

print(implicitlyUO) // prints Optional(4)
print(implicitlyUO.advanced(by: 3)) // prints 7

implicitlyUO = nil

print(implicitlyUO) // prints nil
print(implicitlyUO.advanced(by: 3)) // Here it will crash as now it will be unwrapped and found it nil

var someNilValue:Int?
someNilValue = 4

print(someNilValue) // prints Optional(4)
print(someNilValue?.advanced(by: 3)) // prints Optional(7)

someNilValue = nil

print(someNilValue) // prints nil
print(someNilValue?.advanced(by: 3)) // prints nil
print(someNilValue!.advanced(by: 3)) /* Will crash here as we are force unwrapping nil which is the same case as implicitlyUO */

使用IUO的唯一好处是不需要在代码中不需要!(或显式地展开),但是需要确保它不是nil。