dorentus
2015-09-07 12:12:47 +08:00
在 Swift 里面,关于 Optional 的 ? 和 ! 有以下几种用法:
1 ) 用于类型定义, Type? 其实是 Optional<Type> 的简写,而 Type! 是一种特殊的 Optional 类型( Implicitly Unwrapped Optional )的写法
2 ) ! 用于 Optional 类型变量名的后缀,用于强行解包(失败则触发 runtime error )
3 ) ? 用于 Optional Chaining ,也是解包,不过失败的话不会触发 runtime error
--------
假设 A 是一个类型,那么 A? 类型(其实是 Optional<A>),其实是一个新的类型,它封装了两种可能性: nil 或者 A 的一个实例。
使用 A? 类型的变量的时候(例如 var a: A?),需要进行判断来解出其中封装的 A 的一个实例值,或者 nil 。解包有好几种方式:
1 ) 直接解,用叹号: let b = a!。如果 a 是 nil 的话,会触发 runtime error
2 ) Optional Binding : if let b = a { /* 这里是有值的情况, b 的类型是 A */ } else { /* 这里是 nil 的情况 */ }
3 ) Optional Chaining : a?.foo () /* 假设 A 定义了 func foo () -> B */,这时假如 a 是 nil ,那么方法调用不会发生;否则的话,方法 foo 被调用,返回一个 Optional<B> 即 B? 的类型的值。
有一些情况,我们明确知道某个变量在我们使用的时候一定非 nil ,但是由于某些限制,无法在声明的时候就初始化(例如 ViewController 里面的 IBOutlet ),那么可以把它声明为 Implicitly Unwrapped Optional 类型,即: var a: A!。对于这种,我们可以像对待 A? 类型的变量一样,去做 Optional Binding 或者 Optional Chaining ,也可以把它当作非 Optional 的 A 类型变量一样直接用(但是如果在用的时候 a 是 nil ,那么会触发 runtime error )
另外,不要在自己不确定在做什么的前提下去理会修改建议