我确信这可能是重复的,但我无法找到任何整洁而紧凑的解释,所以就这样了。
我们都知道,如果我们声明一个像这样的变量
1> var a : String?
我们得到一个可选的
a: String? = nil
如果我们省略?
,我们必须在创建时将a
初始化为nil
以外的其他内容。但是,如果我们说类似
2> var a : String!
我们得到了
a: String! = nil
让我感到困惑,因为我认为该声明意味着a
不能是一个可选项。所以,玩弄REPL,我得到以下令人困惑的结果:
3> a!
fatal error: unexpectedly found nil while unwrapping an Optional value
4> a as! String
fatal error: unexpectedly found nil while unwrapping an Optional value
5> a as! String?
$R2: String? = nil
6> a as? String
fatal error: unexpectedly found nil while unwrapping an Optional value
7> a as? String!
$R3: String!? = nil
有人能为此提供一些启示吗?
答案 0 :(得分:3)
nil
就是我们所说的隐式解包的可选。它是一个可选项,可以保存nil
的值,但编译器不会产生任何关于它的编译时错误。
如果它具有nil值并且已被使用,则会出现运行时错误,就像强制解包具有{{1}}值的普通可选项一样。
当可选的值为时,隐式展开的选项很有用 确认在首次定义可选项后立即存在 绝对可以假设存在于此后的每一点。