Mvvm 快速内在任务
几天前,在objc之后,我转向了swift编码。当我使用MVVM模式编写适配器时,我混淆了下一种情况,这种情况可以在objc中完成,不会出现任何问题 所以在Objc中:我们有一个具有presenter(viewModel)属性的IDTableViewController 一切都很好。。。但在斯威夫特,我不能做同样的事情。我无法重写UsersViewController中的属性类Mvvm 快速内在任务,mvvm,swift2,adapter,Mvvm,Swift2,Adapter,几天前,在objc之后,我转向了swift编码。当我使用MVVM模式编写适配器时,我混淆了下一种情况,这种情况可以在objc中完成,不会出现任何问题 所以在Objc中:我们有一个具有presenter(viewModel)属性的IDTableViewController 一切都很好。。。但在斯威夫特,我不能做同样的事情。我无法重写UsersViewController中的属性类 class IDTableViewController: UITableViewController { v
class IDTableViewController: UITableViewController {
var viewModel : IDCollectionPresenterProtocol?
}
class UsersViewController: IDTableViewController {
var viewModel : UsersPresenter?
}
我能做这个吗?如果它不合法,我该如何实施它呢?像这样的东西可能就是你想要的:
protocol MyProtocol {
}
class ImplementedProtocol : MyProtocol {
}
class MyBaseClass<T : MyProtocol> {
var viewModel : T?
}
class MyDerivedClass : MyBaseClass<ImplementedProtocol> {
}
协议MyProtocol{
}
类实现的协议:MyProtocol{
}
类MyBaseClass{
var viewModel:T?
}
类MyDerivedClass:MyBaseClass{
}
现在,当您实例化MyDerivedClass时,viewModel
的类型将是ImplementedProtocol
。
警告一句:Xcode 7.3没有在自动完成中正确地推断出
视图模型的类型,但是将其分配给一个变量修复了该类型-因此这只是一个Xcode错误,希望很快就能修复。有两种方法:
您可以使用作为自己私有存储属性前端的计算属性覆盖存储属性,例如:
class UsersViewController: IDTableViewController {
private var usersViewModel: UsersPresenter?
override var viewModel: IDCollectionPresenterProtocol? {
get { return usersViewModel }
set { usersViewModel = newValue as! UsersPresenter }
}
}
如果需要UsersViewController
中视图模型的UsersPresenter
接口,则根本无法覆盖viewModel
,而只需将usersViewModel
作为计算属性本身实现:
class UsersViewController: IDTableViewController {
private var usersViewModel: UsersPresenter? {
get { return viewModel as? UsersPresenter }
set { viewModel = newValue }
}
}
另一种更自然快捷的处理方法(例如,协议扩展中带有UITableViewDataSource
方法默认实现的泛型或协议)不能很好地处理Objective-C,因此,当您将它们用作视图控制器或UITableViewDataSource
时,您会遇到问题。如果我们生活在一个纯粹的快速世界,我同意这是一个很好的方法。问题是,在Objective-C中不能表示泛型,因此尝试将泛型用于视图控制器和/或UITableViewDataSource
将不起作用。啊,是的,与Objective-C的互操作当然是个问题。这是我们目前必须忍受的痛苦之一:(非常感谢,我需要的是私人财产。)
class UsersViewController: IDTableViewController {
private var usersViewModel: UsersPresenter?
override var viewModel: IDCollectionPresenterProtocol? {
get { return usersViewModel }
set { usersViewModel = newValue as! UsersPresenter }
}
}
class UsersViewController: IDTableViewController {
private var usersViewModel: UsersPresenter? {
get { return viewModel as? UsersPresenter }
set { viewModel = newValue }
}
}