了解可选链接和可选的解包选项

时间:2016-12-14 07:40:08

标签: ios swift uiviewcontroller optional

请考虑以下代码块

// self is a UIViewController
let f = self.view.window?.rootViewController?.view.frame

这里f是一个可选的包装CGRect。 据我所知,

  • view 是隐式展开的属性。(即UIView!)。
  • 我们可以选择展开视图的可选窗口属性来访问它的 window 属性。如果它有值,那么访问它的 rootViewController 属性,否则什么都不做。
  • 同样,我们可选择解包 rootViewController 并访问其视图属性。

  • 最后我们得到了 frame 的视图。

由于任何窗口 rootViewController 都可以为nil,因此frame是可选的。

我是否理解正确。 为什么 UIViewcontroller view 属性是可选的?

2 个答案:

答案 0 :(得分:0)

是的,您的理解是正确的。

  

“具体来说,可选链接调用的结果与预期返回值的类型相同,但包含在可选中。通常返回Int的属性将返回Int?通过可选链接访问时。“

摘自:Apple Inc.“The Swift Programming Language(Swift 3.0.1)。”iBooks。

UIViewController实现了对其视图的延迟加载。 loadView方法负责加载视图层次结构(来自NIB或Storyboard场景)或通过代码创建它。因此,view在初始化和首次引用nil属性之间将为view

答案 1 :(得分:0)

  

view是隐式展开的属性。(即UIView!)。

正确。

  

我们可以通过可选地解包视图的可选窗口属性来访问它的window属性。如果它有值,那么访问它的rootViewController属性,否则什么都不做。

第一部分是正确的,但第二部分有点不对。如果window没有值nil,则代码什么也不做。整个表达式的计算结果为nil。在这种情况下,nil将被分配到f

  

同样,我们可选择解包rootViewController并访问其视图属性。

     

最后我们得到了视野。

那是对的。

  

由于任何window或rootViewController都可以为nil,因此frame是可选的。

从技术上讲,没有。 frame仍然是非可选类型。它只是似乎像一个可选项,因为所有那些解包你做了。 f 是可选的。

  

为什么UIViewcontroller的view属性是可选的?

UIViewController的目的是控制和管理UIView。初始化UIViewController时,无需管理任何视图!视图在调用viewDidLoad之前加载(在loadView方法中)。这就是为什么您在viewDidLoad而不是在初始化程序中执行所有添加子视图代码的原因。