我正在研究它们之间的区别!和?在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
答案 0 :(得分:3)
the book中的两个关键句是:
隐式展开的可选项是幕后的常规可选项,但也可以像非可选值一样使用,而无需在每次访问时解包可选值。
和
你可以想到一个隐式解包的可选项,因为它允许在使用它时自动解包该选项。
我的理解是,一个隐式解包的可选项就像一个普通的可选项,可以像一个一样被访问,包括使用unwrapping!操作员就可以了。隐式展开只会删除 need 来展开,而不是在你不这样做时将其作为错误。
它"正常可选...但是 也可以像非可选值一样使用" - 对我来说意味着两者都是访问它的方法很好。
答案 1 :(得分:-1)
如果变量var
声明为Type!
,则对var
的任何引用都等同于var!
。您可以认为每次使用此变量时编译器都会添加!
。没有"双重打开"在这里,它是单一的解包。