我有这个基类:
class FieldModel<T>{
var pageModel : PageModel
var fieldId : String
var fieldTitle : String
var required : Bool
var type : String
var rule : ShowHideRule?
var fieldValue : T?
init(json:JSON, pageModel : PageModel){
//not important
}
}
和这个子类:
class HeaderFieldModel : FieldModel<String> {
override init(json: JSON, pageModel: PageModel) {
super.init(json: json, pageModel: pageModel)
}
}
为什么
class FieldFactory {
class func createField< T : FieldModel<AnyObject> >
(json: JSON, pagemodel: PageModel) -> T {
let type = json["type"].stringValue
switch type {
case "header":
return HeaderFieldModel(json: json, pageModel: pagemodel)
case "mood":
return MoodFieldModel(json: json, pageModel: pagemodel)
// ...
}
}
}
}
...给我:
无法将
HeaderFieldModel
类型的返回表达式转换为返回类型T
我正在返回的类满足条件,它是FieldModel的子类。 即使我将泛型类型从AnyObject更改为String,使其与HeaderFieldModel中的完全相同,也没有任何变化。
答案 0 :(得分:1)
您的通用约束说:
.bss
T被定义为T : FieldModel<AnyObject>
的子类。应该从这个方法返回一个特定的子类。
但是,您的FieldModel
返回两个或更多不同的子类,而不是一个子类。
你真正想要的是:
switch
您希望该方法能够返回class func createField(json: JSON, pagemodel: PageModel) -> FieldModel<String>
的任何子类,而不是一个特定的子类。
当然,还要注意FieldModel
不是HeaderFieldModel
的子类。