ios - Swift 中的多个泛型类继承

标签 ios swift generics inheritance

假设我有一个模型和一个基本模型:

class BaseModel: NSObject {
    var name = ""
}

class Model: BaseModel {
    var desc = "abc"
}

我添加了一个服务来处理这些模型:

class AbstractService<T: NSObject>: NSObject {
    var items = [T]()
}

class BaseModelService<T: BaseModel>: AbstractService<BaseModel> {
}

class ModelService<T: Model>: BaseModelService<Model> {
}

现在我想从 ModelService 访问 items 变量并期望得到一个 Model 数组,但我得到了 BaseModel 改为:

Error message: Cannot assign a value of type [BaseModel] to a value of type [Model]

我是不是漏掉了一些关于泛型的东西?

这是 Playground 的完整代码:

//: Playground - noun: a place where people can play

import UIKit

/// Models:
class BaseModel: NSObject {
    var name = ""
}

class Model: BaseModel {
    var desc = "abc"
}

/// Services:
class AbstractService<T: NSObject>: NSObject {
    var items = [T]()
}

class BaseModelService<T: BaseModel>: AbstractService<BaseModel> {
}

class ModelService<T: Model>: BaseModelService<Model> {
}

/// ViewController:
class ViewController: UIViewController {

    let modelService = ModelService()
    var items = [Model]()

    override func viewDidLoad() {
        super.viewDidLoad()

        items = modelService.items // The error appears here: Cannot assign a value of type [BaseModel] to a value of type [Model]
    }

}

最佳答案

问题是你强制BaseModelService成为 AbstractModelService<BaseModel> 的子类这意味着 items输入 [BaseModel] .声明BaseModelService如下:

class BaseModelService<T: BaseModel>: AbstractService<T> {

那么你就可以开始了。

关于ios - Swift 中的多个泛型类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32967079/

相关文章:

c# - 我可以定义一个只接受原始类型的方法吗?

ios - NSMutableArray 是如何在快速枚举中达到这么高的速度的

ios - 带 Metal 的索引图

c# - 从通用列表中删除所有相同的值

swift - "_"类型在快速错误消息中意味着什么?

iOS:如何在不使用第三方库或 pod 的情况下在 Swift 中创建可扩展的 TableView

java - <X>在java方法声明中是什么意思?

IOS保留一个viewcontroller

ios - iOS11中,如何让后台任务运行超过10分钟?

iphone - iOS 排行榜游戏中心