[英]UIWindow in Xcode 6 templates
我有一个简单的问题,为什么Xcode中所有Apple模板上的主要(也是唯一的UIWindow)都声明为var而不是let。
var window: UIWindow?
据我了解,我们应该尽可能地使用let,尤其是在实例不会改变的地方。
同样,将let与对象一起使用仍然允许您修改其属性(框架等)。
我在理解何时将let与对象(类类型)一起使用时遇到了一些麻烦。
我认为像CLLocationManager
和UIWindow
这样的东西将是何时将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.