在Swift中,如果你打开一个“Implicitly Unwrapped Optional”这是一个双重展开吗?

时间:2014-12-08 16:28:51

标签: ios swift optional

我正在研究它们之间的区别!和?在var声明中。

我的问题简短

If you call unwrap! on a a var declared with ! - why isnt this a double unwrap?

我创建了两个IBOutlets,因为这是什么时候!用得很多

@IBOutlet weak var searchBar1: UISearchBar? //"Optional"
@IBOutlet weak var searchBar2: UISearchBar! //"Implicitly Unwrapped Optional"

据我所知,如果网点不是零,那么所有这些都可以使用

self.searchBar1!.text = "dd" //builds ok but crashes on nil
self.searchBar2!.text = "dd" //builds ok but crashes on nil

self.searchBar1?.text = "dd1" //builds ok but does nothing on nil
self.searchBar2?.text = "dd1" //builds ok but does nothing on nil

//---
self.searchBar1.text = "dd2"  //ERROR: 'UISearchBar?' does not have a member named 'text'
self.searchBar1!.text = "dd2" //OK: must unwrap Optional(UISearchBar) to UISearchBar
self.searchBar1!.text = "dd2" //OK: must unwrap Optional(UISearchBar) to UISearchBar 

self.searchBar2.text = "dd2"  //ok unwrap declared in var but will crash if nil
//----

我认为最后一行有效是正确的,因为unwrap在var声明中

这是因为解开!在var声明中

self.searchBar2.text = "dd2" 

为什么这不会崩溃 - 这不是双重打开

self.searchBar2!.text = "dd" 

self.searchBar是Optional(UISearchBar)>>解开! self.searchBar2! >>的UISearchBar

2 个答案:

答案 0 :(得分:3)

the book中的两个关键句是:

  

隐式展开的可选项是幕后的常规可选项,但也可以像非可选值一样使用,而无需在每次访问时解包可选值。

  

你可以想到一个隐式解包的可选项,因为它允许在使用它时自动解包该选项。

我的理解是,一个隐式解包的可选项就像一个普通的可选项,可以像一个一样被访问,包括使用unwrapping!操作员就可以了。隐式展开只会删除 need 来展开,而不是在你不这样做时将其作为错误。

它"正常可选...但是 可以像非可选值一样使用" - 对我来说意味着两者都是访问它的方法很好。

答案 1 :(得分:-1)

如果变量var声明为Type!,则对var的任何引用都等同于var!。您可以认为每次使用此变量时编译器都会添加!。没有"双重打开"在这里,它是单一的解包。