ios – 在Swift中使用泛型的EXC_BAD_ACCESS

ios – 在Swift中使用泛型的EXC_BAD_ACCESS,第1张

概述相关问题: Generic completion handler in Swift 在我写的Swift应用程序中,我正在下载JSON,我想将其转换为模型对象.现在,我这样做: func convertJSONData<T: Entity>(jsonData: NSData?, jsonKey: JSONKey, _: T.Type) -> [T]? { var entities = 相关问题: Generic completion handler in Swift

在我写的Swift应用程序中,我正在下载JsON,我想将其转换为模型对象.现在,我这样做:

func convertJsONData<T: Entity>(JsonData: NSData?,JsonKey: JsONKey,_: T.Type) -> [T]? {        var entitIEs = [T]()        if let data = JsonData {            // left out error checking for brevity            var Json = JsON(data: data,options: nil,error: nil)            var entitIEsJsON = Json[JsonKey.rawValue]            for (index: String,subJson: JsON) in entitIEsJsON {                // Error: EXC_BAD_ACCESS(code=EXC_I386_GPFLT)                let entity = T(Json: subJson)                entitIEs.append(entity)            }        }        return entitIEs    }

符合Entity的每个对象都实现init(Json:JsON). JsON是SwiftyJSON库中定义的类型.这也是枚举看起来有点奇怪的原因.

我在这个方法中调用convertJsONData():

public func performJsONRequest<T where T: Entity>(JsonRequest: JsONRequest<T>) {        var urlString = ...        Alamofire.request(.GET,urlString,parameters: nil,enCoding: .JsON).response { (request,response,data,error) -> VoID in                var books = self.convertJsONData(data as? NSData,JsonKey: JsonRequest.JsonKey,T.self)                JsonRequest.completionHandler(books,error)        }    }

我得到一个运行时EXC_BAD_ACCESS(code = EXC_I386_GPFLT)错误调用T(Json:subJsON).没有编译器警告或错误.虽然我在上面的代码中省略了错误检查,但实际代码中存在错误检查,错误为零.

我不确定这是一个编译器错误还是我的错,任何帮助搞清楚都非常感激.

解决方法 这里有几件事情,我怀疑问题出在实现Entity协议的类的初始化器中.

假设代码类似于以下内容:

protocol Entity {    init(Json: JsON)}class EntityBase: Entity {    var name: String = ""    required init(Json: JsON) { // required keyword is vital for correct type inference        if let nameFromJson = Json["name"].string {            self.name = nameFromJson        }    }    func getname() -> String { return "Base with \(name)" }}class EntitySub: EntityBase {    convenIEnce required init(Json: JsON) {        self.init(Json: Json)  // the offending line    }    overrIDe func getname() -> String { return "Sub with \(name)" }}

代码在子类中使用self.init(Json:Json)进行编译,但实际上尝试使用方法初始化实例会导致EXC_BAD_ACCESS.

删除子类上的初始化程序或者只需实现所需的init和调用super.

class EntitySub: EntityBase {    required init(Json: JsON) {        super.init(Json: Json)    }    overrIDe func getname() -> String { return "Sub with \(name)" }}

将JsonData转换为Entity的方法(稍微修改为JsonData为nil时特别返回.None):

func convertJsONData<T:Entity>(JsonData: NSData?,type _:T.Type) -> [T]? {    if let JsonData = JsonData {        var entitIEs = [T]()        let Json = JsON(data: JsonData,options:nil,error:nil)        let entitIEsJsON = Json[JsonKey.rawValue]        for (index:String,subJson:JsON) in entitIEsJsON {            let entity:T = T(Json: subJson)            entitIEs.append(entity)        }        return entitIEs    }    return .None}
总结

以上是内存溢出为你收集整理的ios – 在Swift中使用泛型的EXC_BAD_ACCESS全部内容,希望文章能够帮你解决ios – 在Swift中使用泛型的EXC_BAD_ACCESS所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1114205.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存