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

时间:2014-06-03 13:25:33

标签: ios swift

正如文档所说“您确定可选项确实包含值,您可以通过添加感叹号来访问其基础值(!)

那么为什么UIViewController init方法使用

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

告诉我“如果指定nil,则nibName属性设置为nil。

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

我对此很困惑。

4 个答案:

答案 0 :(得分:2)

根据我的理解,?用于表示可选变量。 !用于访问可选变量的值。文件说

  

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

这意味着只有在您确定它具有非零值时才使用!,否则会抛出错误。 就像强制可选变量具有值 一样。

然后关于你的问题

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

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

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

答案 1 :(得分:2)

!是纯粹的语法糖。变量仍然是可选的;您可以将其用作普通可选项,传递nil等。只有这样才能简化到nibName,而不是使用完整nibName!

来源 -

  

“这些选项被定义为隐式解包的选项。您可以通过在要使其成为可选类型之后放置感叹号(String!)而不是问号(String?)来编写隐式展开的可选项。“...

     

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

     

摘录自:Apple Inc. “The Swift Programming Language.” iBooks

答案 2 :(得分:1)

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

调用Objective C框架代码。这会调用initWithNibName:bundle。您可以选择传递此方法的参数nil。目标C很好。如果在initiWithNibName中传递nil,它会尝试根据相关类的名称为您解析名称。如果传入nil for bundle,则将其替换为[NSBundle mainBundle]。

因此,Swift使这个参数成为可选参数。必须这样做以允许变量可选地为零。问题是为什么它不能使它成为一个标准的可选项,并要求你明确地打开它。答案是隐式展开的可选项在将其传递给Objective C之前立即展开可选项。您不希望必须明确解包这个问题,因为一旦您传入参数,无论是否为nil,您都已完成设置。您不希望必须明确展开它,然后将其传递给Objective C!这样做没有任何意义。

答案 3 :(得分:0)

我在Site

上找到了以下内容
  

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

我不确定这是否合理。