Swift

时间:2015-10-06 09:59:23

标签: 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> {
}

现在我想要访问items中的ModelService变量并期望得到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]
    }

}

2 个答案:

答案 0 :(得分:2)

问题是,您强制BaseModelService成为AbstractModelService<BaseModel>的子类,这意味着items已键入[BaseModel]。声明BaseModelService如下:

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

然后你很高兴。

答案 1 :(得分:1)

在您的情况下,声明应为:

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

class ModelService: BaseModelService<Model> {
}

当你这样做时:

class BaseModelService<T: BaseModel>: AbstractService<BaseModel> {
}
T的{​​p> AbstractServiceT的{​​{1}}是两种不同的类型。 前者约束于具体BaseModelService,而后者约束为BaseModel的子类型,而根本不使用。