我来自 Objective C 背景,我通常习惯于在给定类的 init 方法中声明我的属性(类的全局变量),即像这样:
-(instancetype) init {
self = [super init];
if(self){
self.viewModel = [[MyViewModel alloc] init:self];
}
return self;
}
当 self.viewModel 是一个属性时,我通常将 View Controller 作为参数传递给 View 模型以进行回调。我目前正试图在 swift 中做同样的事情。
我有一个普通的自定义 View Controller 类,具有以下初始化方法:
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nil, bundle: nil)
self.viewModel = SearchViewModel(callback: self)
}
现在使用上面的代码,xcode 会提示
self.viewModel has not been initialised
但是,当我尝试初始化 viewModel 时,即:
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
self.viewModel = SearchViewModel(callback: self)
super.init(nibName: nil, bundle: nil)
}
然后我得到
self used before super.init call
我如何在 Swift 中解决这个问题?
最佳答案
首先:Swift
初始化器希望在调用 super 初始化器之前正确设置 self
的所有属性/具有一个值。
第二点:你不能在 super.init
调用之前使用 self
,否则你将在 super 构造函数中设置的属性尚未设置无论谁收到未完成的self
-instance 都无法确定self
的状态。
解决方案:制作类型为 SearchViewModel!
的 viewModel
并使用第一个代码替代方案。
说明:通过使 viewModel
成为一个隐式展开的可选项,它在开头隐式包含 nil
,因此您现在可以调用 super.init
和之后将 实际 值设置为 viewModel
。
关于ios - 何时使用 swift 初始化 viewController 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899145/