我有一个基本视图控制器和一些子视图控制器。我很难将在子视图控制器(CommentViewController)中创建的视图模型传递给它的父视图控制器(FeedBaseViewController)来访问。
class BaseViewController: UIViewController {
...
}
class FeedBaseViewController: BaseViewController {
var viewModel1 = FeedBaseViewModel<BaseObject>()
...
}
class CommentViewController: FeedBaseViewController {
var viewModel2: CommentViewModel<CommentObject>
init() {
viewModel2 = CommentViewModel()
/* This is where I have issue, and I tried a few approaches. And here are the 2 of them.*/
// Method 1:
// viewModel1 = viewModel2
// Error: Cannot assign value of type 'CommentViewModel<CommentObject>' to type 'FeedBaseViewModel<BaseObject>'
// Method 2:
// viewModel1 = viewModel2 as FeedBaseViewModel<BaseObject>
// Error: Cannot convert value of type 'CommentViewModel<CommentObject>' to type 'FeedBaseViewModel<BaseObject>' in coercion
...
}
...
}
我的视图控制器的视图模型
class FeedBaseViewModel<Item: BaseObject> {
}
class CommentViewModel<T: CommentObject>: FeedBaseViewModel<CommentObject> {
}
以下是对象类,BaseObject类是此处唯一的Objective-C类,以及从BaseObject继承的CommentObject swift类。
@interface BaseObject : NSObject <NSCoding>
@end
class CommentObject: BaseObject {
}
我不确定是否可以这样做,或者只是语法问题。 请指教,谢谢!
已编辑(2017-09-11):
我想我可以提供更多我希望实现的信息,并希望它有所帮助。
FeedBaseViewModel
存储和操作类型为BaseObject的项目数组。
FeedBaseViewController
具有UI处理操作,例如&#34;过滤&#34;,&#34;排序&#34;,并要求FeedBaseViewModel
完成工作。
对于Comment部分,我将有一个CommentObject
数组,其中包含基本操作和一些特定操作。这就是CommentViewModel
进来的原因,CommentViewModel
继承FeedBaseViewModel
,以便父进程可以处理基本操作,并且它将自行执行特定操作。
在视图控制器部分类似,CommentViewController
将继承FeedBaseViewController
,因此FeedBaseViewController
可以执行基本处理,而CommentViewController
本身可以提供其他功能。
答案 0 :(得分:1)
我认为不可能。
你的问题归结为:
let m = FeedBaseViewModel<CommentObject>()
let k : FeedBaseViewModel<BaseObject> = m
这是不允许的。至于原因:假设FeedBaseViewModel
包含其泛型类型的成员,并为该成员提供set
函数。 如果,您现在可以写第二行,然后使用违反set
通用约束的BasObject
实例调用m
,因为它们仍然是同一个具有不同通用约束的对象实例,BaseObject
实例不一定是CommentObject
的实例。
您的案例中的解决方案应该是将泛型更多地移动一下:
class FeedBaseViewController<T : BaseObject>: BaseViewController {
var viewModel1: FeedBaseViewModel<T>
required init?(coder aDecoder: NSCoder) {
viewModel1 = FeedBaseViewModel<T>()
super.init(coder: aDecoder)
}
}
class CommentViewController: FeedBaseViewController<CommentObject> {
var viewModel2: CommentViewModel<CommentObject>
required init?(coder aDecoder: NSCoder) {
viewModel2 = CommentViewModel<CommentObject>()
super.init(coder: aDecoder)
viewModel1 = viewModel2
// now this assignment is allowed because viewModel1 and viewModel2 have the super type FeedBaseViewModel<CommentObject>
}
}
不确定该解决方案是否适用于您的情况。