在UIViewController
的Swift实现中,我们有机会使用默认属性值,而不必执行UIViewController
初始化仪式。例如:
class ViewController: UIViewController {
let model = SomeModelObject()
这种方法有什么影响,而不是在viewDidLoad
中实例化模型属性?例如:
class ViewController: UIViewController {
var model: SomeModelObject?
override func viewDidLoad() {
super.viewDidLoad()
model = SomeModelObject()
如果分配给属性的对象始终以已知的方式实例化,那么设置默认属性值是否更有意义而不是将其设置为可选,并在viewDidLoad
内为其赋值?在oC实现中,我们通常实现init
,并使用if ([super init])
惯用法有条件地初始化控制器属性。但是,在撰写本文时,似乎Apple的大多数示例代码都没有遵循Swift中的默认属性值。
答案 0 :(得分:3)
现在说Swift的传统还为时尚早。我们仍然在弥补它。 Apple的示例代码是一个臭名昭着的糟糕指南(编程指南一直是更好的选择)。阅读devforums通常是一种更好的方式来了解Swift团队认为Swift的好处(但是随着语言的变化,样式也在发生变化)。
在许多情况下,在声明中分配值可能是最好的方法,只要你能做到。有些内容在viewDidLoad
之前无法使用,因此您无法在之前初始化它们。
在ObjC中,将事物放在init
中并不是那么好,因为通常不会调用init
。最终必须将内容放在init
和initWithCoder:
中(这意味着您需要将初始化提升到另一种方法,如“setup”)。还有一些关于init
与initWithNibName:bundle:
整合的歌曲和舞蹈,可以咬你,因为那是指定的初始值(不是init
)。你必须非常小心。
所有这些都经常导致ObjC代码将大多数初始化放在viewDidLoad
中,因为它更可靠(至少从iOS 6开始,当他们摆脱viewDidUnload
时)。
所有这一点,即使在ObjC中,这也不是一个简单的问题。但是在Swift中,我会说放置模型的更好的地方是默认的初始化器,就像你说的那样,并在viewDidLoad
中像在ObjC中那样做。但我们仍然在搞清楚。