为什么隐式解开的可选值为nil而不打印CRIL而不是CRASH? 应该崩溃,不打印“ nil”
var x : Int!
print(x) //nil
答案 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。