Swift不能将子类作为超类返回

时间:2016-03-07 14:10:38

标签: ios swift generics

我有这个基类:

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中的完全相同,也没有任何变化。

1 个答案:

答案 0 :(得分:1)

您的通用约束说:

.bss

T被定义为T : FieldModel<AnyObject> 的子类。应该从这个方法返回一个特定的子类。

但是,您的FieldModel返回两个或更多不同的子类,而不是一个子类。

你真正想要的是:

switch

您希望该方法能够返回class func createField(json: JSON, pagemodel: PageModel) -> FieldModel<String> 的任何子类,而不是一个特定的子类。

当然,还要注意FieldModel不是HeaderFieldModel的子类。