ios - 何时使用 swift 初始化 viewController 全局变量

标签 ios swift

我来自 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/

相关文章:

ios - Eureka 为 TimeRow 设置最小/最大日期

ios - 如何使用 Swift iOS 向 UIAlertView 按钮添加操作

ios - 从 managedObjectContext 和 tableView 中删除 NSManagedObject

Swift:无法将文件复制到新创建的文件夹

ios - 变换旋转后如何找到UIView的框架

ios - Xcode 7.3.1。我的事件指示器一直在旋转

swift - 调用中缺少参数 #4 的参数会忽略闭包

ios - 动态设置 ScrollView 的内容大小不起作用

swift - 使用 UIImagePickerController 加载相机或 PhotoLibrary?

DateFormatter 中的 Swift 语言错误?