假设我的控制器使用了一个视图模型来询问某些数据或功能,那么实例化一次后,该视图模型就不会改变,对吗?但是在视图控制器中,我使用Perform Segue进行导航,等等,我无权访问初始化程序,因此无法使用诸如此类的东西:
let myViewModel: MyViewModel
然后我必须改用它:
var myViewModel: MyViewModel!
我对此并不满意,有人可以提出一个好的解决方案吗? tnx队友:)
答案 0 :(得分:2)
那很好,对于您的IBOutlets也一样。
从实例化ViewController到设置模型的那一刻,它的值为nil
。这意味着它不是常量,即使您没有在ViewController的整个生命周期中对其进行更改。
答案 1 :(得分:1)
从情节提要中加载视图控制器时,您无法控制初始化(因为控制器未由您初始化),因此您无能为力。其他选项相似,并且其中任何一个都没有真正的优势。这是一个主观决定:
您可以将变量声明为普通的可选
int compare = this.getStartDate().compareTo(o.getStartDate());
if (compare > 0 && this.getStartDate().charAt(1) >= '1' && this.getStartDate().charAt(1) <= '7')
return -1;
if (compare < 0 && o.getStartDate().charAt(1) < '1' && o.getStartDate().charAt(1) > '7')
return 1;
return compare;
但是如果控制器真的不能在没有设置数据的情况下工作,我宁愿自己使用var myViewModel: MyViewModel?
,因为不设置数据模型应该是致命的错误。
在某些情况下,您还可以使用默认值,例如:
!
我的数据设置器通常如下所示:
var myViewModel = MyViewModel()
答案 2 :(得分:0)
如果要在实例化后更改ViewModel,可以使用var
声明。
在segue函数中,如果将viewModel实例定义为还编写了segue函数的类的class属性,则可以访问该视图模型实例。
在segue函数中创建viewModel的隐式展开实例不是一个好主意。
var myViewModel: MyViewModel!
这可能导致崩溃。