迅速内在的任务

时间:2016-06-24 16:59:50

标签: mvvm swift2 adapter

前几天我在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?
}

我可以这样做吗?如果它不合法,我该如何实施呢?

2 个答案:

答案 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)

有几种方法:

  1. 您可以使用计算属性覆盖存储的属性,该属性是您自己的私有存储属性的前端,例如:

    class UsersViewController: IDTableViewController {
        private var usersViewModel: UsersPresenter?
        override var viewModel: IDCollectionPresenterProtocol? {
            get { return usersViewModel }
            set { usersViewModel = newValue as! UsersPresenter }
        }
    }
    
  2. 您根本无法覆盖viewModel,如果您需要usersViewModel UsersPresenter视图模型的接口,则只需将UsersViewController实现为计算属性本身}:

    class UsersViewController: IDTableViewController {
        private var usersViewModel: UsersPresenter? {
            get { return viewModel as? UsersPresenter }
            set { viewModel = newValue }
        }
    }
    
  3. 另一种更自然的Swifty处理方式(例如,泛型或协议,在协议扩展中使用UITableViewDataSource方法的默认实现)不能很好地与Objective-C一起使用,所以你&# 39;将它们用作视图控制器或UITableViewDataSource时会出现问题。