繁体   English   中英

Xcode 6模板中的UIWindow

[英]UIWindow in Xcode 6 templates

我有一个简单的问题,为什么Xcode中所有Apple模板上的主要(也是唯一的UIWindow)都声明为var而不是let。

var window: UIWindow?

据我了解,我们应该尽可能地使用let,尤其是在实例不会改变的地方。

同样,将let与对象一起使用仍然允许您修改其属性(框架等)。

我在理解何时将let与对象(类类型)一起使用时遇到了一些麻烦。

我认为像CLLocationManagerUIWindow这样的东西将是何时将let与对象配合使用的完美示例,但Apple似乎并未在其代码中使用let。

在对象初始化之前 ,用let关键字定义的属性必须具有一个值 该窗口不是在初始化期间创建的,因此不能让它出租。

对于视图控制器,情况是相同的-不能让所有出口,甚至视图属性都不能出租,因为它们在初始化时不存在,但是在需要视图时才创建。

let属性对于UIKit和视图控制器来说并不是很好用-根据设计,视图控制器在初始化方面不会做很多工作,您只能在那时设置let。 您绝对正确,因为let属性对于诸如位置管理器或托管对象上下文之类的东西非常有用,但是事实证明, lazy var通常是更好的选择。

在我的经验(有限的,就像每个人一样!)中, let属性非常适合用于创建不可变的模型类,而local let是创建代码内引用的默认方法。

您可以使用let属性并在那里定义它们,因此对于位置管理器来说:

let locationManager = CLLocationManager()

想一想有关创建该属性的任何信息所需的信息。 如果可以在没有任何上下文的情况下从头开始制作它,请像上面的示例一样进行操作。 如果它需要传入委托或任何其他属性,则可能在初始化后创建或设置它,因此让它不合适。

如果将window属性定义为let ,则从主故事板上实例化默认视图控制器时,UIKit框架将无法设置应用程序委托的window属性。

因此答案是:

如果要手动执行代码中的所有操作,则可以使用let来定义window属性。 这样,您必须在AppDelegate init(...)方法中对其进行init(...)

否则,如果您要使用情节提要板并使用默认的视图控制器自动实例化它们,则必须将window定义为var并享受apple替您执行的例程。

应该在application:didFinishLaunchingWithOptions:函数内部进行初始化。 这样,您可以创建适合您需要的不同窗口。 例如:

  • 该应用程序可能在后台启动以执行任务-无需在此处初始化窗口。
  • 通知可能正在启动应用程序-可能会创建其他窗口对象。

另外,正如@Keenle指出的那样,如果您使用界面构建器来调整应用程序的形状,则会在运行时创建并分配窗口。 如果window属性是常量,则决不能这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM