UIViewController初始化方法中的隐式解包选项

正如文档中所说:“ 你确定可选项包含一个值,你可以通过添加一个感叹号(!)来访问它的基础值

那么为什么UIViewController init方法使用

init(nibName nibName: String!,bundle nibBundle: NSBundle!)

并告诉我“ 如果你指定nil,nibName属性设置为零”。

为什么不使用init(nibName nibName: String?,bundle nibBundle: NSBundle?)呢?

我对此很困惑。

 init(nibName nibName: String!,bundle nibBundle: NSBundle!) 

正在调用Objective C框架代码。 这将调用initWithNibName:bundle。 你可以select传递这个方法的参数nil。 目标C没有问题。 如果你在initWithNibName中传递nil,它会根据相关类的名字尝试为你parsing名字。 如果你通过nil来取代bundle,它会用[NSBundle mainBundle]replace它。

所以,Swift使这个参数是可选的。 它必须这样做,以允许该variables可选地为零。 问题是为什么不把它作为一个标准的可选,并要求你明确解开它。 答案是,隐式解包的可选方法在将可选方法传递给目标C之前立即解包可选scheme。因为一旦将parameter passing给对象,无论是否为零,您都不需要明确解开这个选项。 你不需要明确地打开它,然后把它传递给Objective C! 这样做没有任何意义。

从我的理解? 用来表示一个可选的variables。 ! 用于访问可选variables的值。 文件说

“一旦确定可选包含值,可以通过添加感叹号(!)来访问其基础值”

这意味着使用! 只有当你确定它有一个非零值,否则会抛出错误。 它像强迫一个可选variables有价值

然后关于你的问题

 init(nibName nibName: String!,bundle nibBundle: NSBundle!) 

这里init函数强制调用者传递nibNamenibBundle的值。 它不可能是零。 ! 用于确保参数具有非零值

注意:如果我错了,请纠正我,我只是学习:)

! 是一种纯粹的语法糖。 该variables仍然是可选的; 你可以使用它作为一个普通的可选项,传递nil等。它只是必要的,所以你可以简化为nibName而不是使用完整的nibName!

资源-

“这些可选项被定义为隐含的解包选项。 你写一个隐式解包的可选项,通过放置一个感叹号( String! ),而不是一个问号( String? )后,你想要使可选的types“…

“隐式解包可选是幕后的普通可选,但也可以像非可选值一样使用,而不必在每次访问时展开可选值。 ”

摘录自: 苹果公司“Swift编程语言”,iBooks

我在这个网站上发现了以下内容

在某些情况下,您可能绝对确定Objective-C方法或属性永远不会返回零对象引用。 为了使这个特殊场景中的对象更加方便,Swift将对象types导入为隐式展开的可选项。 隐式解包可选types包括可选types的所有安全特性。 此外,您可以直接访问该值,而无需检查零或自己解包。 当您访问这种types的可选types的值时,如果不安全地解包它,隐式解包的可选操作将检查值是否丢失。 如果缺less该值,则会发生运行时错误。 因此,除非您确定该值不能丢失,否则应该始终检查并解包一个隐式解包的可选项。

我不确定,如果这是有道理的。