2015-10-06 148 views
0

考慮我有一個模型,併爲它的基本模型:多泛型類繼承

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> { 
} 

現在我要訪問從ModelServiceitems變量,並期望得到的Model秒的陣列,但我得到BaseModel!而非:

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

我是否錯過了泛型?

下面是遊樂場的全碼:

//: 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] 
    } 

} 

回答

1

在你的情況,聲明應該是:

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

class ModelService: BaseModelService<Model> { 
} 

當你這樣做:

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

TAbstractServiceTBaseModelService是兩種截然不同的類型。 前者限於混凝土BaseModel,而後者限制爲BaseModel的亞型,根本不使用。

+0

非常感謝你,現在工作得很好! –

2

的問題是你逼BaseModelService是的AbstractModelService<BaseModel>子類,這意味着items鍵入[BaseModel]。聲明BaseModelService如下:

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

那麼你是好去。