Mvvm 快速内在任务

Mvvm 快速内在任务,mvvm,swift2,adapter,Mvvm,Swift2,Adapter,几天前,在objc之后,我转向了swift编码。当我使用MVVM模式编写适配器时,我混淆了下一种情况,这种情况可以在objc中完成,不会出现任何问题 所以在Objc中:我们有一个具有presenter(viewModel)属性的IDTableViewController 一切都很好。。。但在斯威夫特,我不能做同样的事情。我无法重写UsersViewController中的属性类 class IDTableViewController: UITableViewController { v

几天前,在objc之后,我转向了swift编码。当我使用MVVM模式编写适配器时,我混淆了下一种情况,这种情况可以在objc中完成,不会出现任何问题

所以在Objc中:我们有一个具有presenter(viewModel)属性的IDTableViewController

一切都很好。。。但在斯威夫特,我不能做同样的事情。我无法重写UsersViewController中的属性类

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 }
        }
    }