Swift通用继承

时间:2017-09-08 08:44:33

标签: swift generics inheritance

我有一个基本视图控制器和一些子视图控制器。我很难将在子视图控制器(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本身可以提供其他功能。

1 个答案:

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

不确定该解决方案是否适用于您的情况。