考虑我有一个模型和基础模型:
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
:
我是否遗漏了仿制药?
以下是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]
}
}
答案 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> AbstractService
和T
的{{1}}是两种不同的类型。
前者约束于具体BaseModelService
,而后者约束为BaseModel
的子类型,而根本不使用。