gpt4 book ai didi

ios - Swift 不能将子类作为父类(super class)返回

转载 作者:行者123 更新时间:2023-11-29 01:10:13 25 4
gpt4 key购买 nike

我有这个基类:

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)
// ...
}
}
}
}

...给我:

Cannot convert return expression of type HeaderFieldModel to return type T

我返回的类满足条件,它是 FieldModel 的子类。即使我将泛型类型从 AnyObject 更改为 String,使其与 HeaderFieldModel 中的完全相同,也不会发生任何变化。

最佳答案

您的通用约束说:

T : FieldModel<AnyObject>

T 被定义为 FieldModel 的子类.该方法应该返回一个特定的子类。

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

你真正想要的是:

class func createField(json: JSON, pagemodel: PageModel) -> FieldModel<String> 

您希望该方法能够返回 FieldModel 的任何子类,不是一个特定的子类。

当然,还要注意HeaderFieldModel不是 FieldModel<AnyObject> 的子类.

关于ios - Swift 不能将子类作为父类(super class)返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35845880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com