前几天我在objc之后转向快速编码。当我用MVVM模式编写适配器时,我对下一个案例感到困惑,这可以在objc中完成而没有任何问题。
所以在Objc中:我们有IDTableViewController和presenter(viewModel)属性
@interface IDTableViewController : UITableViewController
@property (nonatomic, strong) id<IDCollectionPresenterProtocol> presenter;
@end
当我们继承IDTableViewController时,我们覆盖扩展中的presenter类(当然这符合上面提到的协议)
UsersViewController.h
@interface UsersViewController : IDTableViewController
UsersViewController.m
@interface UsersViewController ()
@property (nonatomic, strong) UsersPresenter *presenter;
@end
@implementation UsersViewController
@dynamic presenter;
一切都很好......但是我很快就能做同样的事情。我无法覆盖UsersViewController
中的属性类class IDTableViewController: UITableViewController {
var viewModel : IDCollectionPresenterProtocol?
}
class UsersViewController: IDTableViewController {
var viewModel : UsersPresenter?
}
我可以这样做吗?如果它不合法,我该如何实施呢?
答案 0 :(得分:0)
这样的事情可能就是你想要的:
protocol MyProtocol {
}
class ImplementedProtocol : MyProtocol {
}
class MyBaseClass<T : MyProtocol> {
var viewModel : T?
}
class MyDerivedClass : MyBaseClass<ImplementedProtocol> {
}
现在,当您实例化MyDerivedClass
时,viewModel
将为ImplementedProtocol
类型。
一句警告:Xcode 7.3没有正确推断自动完成中viewModel
的类型,而是将其分配给固定的变量 - 所以它只是一个Xcode错误,希望很快得到修复。
答案 1 :(得分:0)
有几种方法:
您可以使用计算属性覆盖存储的属性,该属性是您自己的私有存储属性的前端,例如:
class UsersViewController: IDTableViewController {
private var usersViewModel: UsersPresenter?
override var viewModel: IDCollectionPresenterProtocol? {
get { return usersViewModel }
set { usersViewModel = newValue as! UsersPresenter }
}
}
您根本无法覆盖viewModel
,如果您需要usersViewModel
UsersPresenter
视图模型的接口,则只需将UsersViewController
实现为计算属性本身}:
class UsersViewController: IDTableViewController {
private var usersViewModel: UsersPresenter? {
get { return viewModel as? UsersPresenter }
set { viewModel = newValue }
}
}
另一种更自然的Swifty处理方式(例如,泛型或协议,在协议扩展中使用UITableViewDataSource
方法的默认实现)不能很好地与Objective-C一起使用,所以你&# 39;将它们用作视图控制器或UITableViewDataSource
时会出现问题。