请考虑以下代码块
// self is a UIViewController
let f = self.view.window?.rootViewController?.view.frame
这里f是一个可选的包装CGRect。 据我所知,
同样,我们可选择解包 rootViewController 并访问其视图属性。
最后我们得到了 frame 的视图。
由于任何窗口或 rootViewController 都可以为nil,因此frame是可选的。
我是否理解正确。 为什么 UIViewcontroller 的 view 属性是可选的?
答案 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
而不是在初始化程序中执行所有添加子视图代码的原因。