首页 > 解决方案 > 类型“响应”不符合协议“可解码”\“可编码”

问题描述

class ErrorObj: NSObject,Codable {
    var numError:Int = 0
    var DescriptionError = ""
}

class Response<T: Codable>: NSObject, Codable { 
    var error:ErrorObj!
    var result:T!
    
    
    func getResponse(errorObj:(ErrorObj)->Void,sucssesObj:(T)->Void) {
        if error.numError != 0 {
            errorObj(error)
        } else{
            sucssesObj(result)
        }
    }
    
}

错误:

无法自动合成“Decodable”,因为“T?” 不符合 'Decodable' 协议需要初始化器 'init(from:)' 类型为 'Decodable'

无法自动合成“Decodable”,因为“T?” 不符合 'Encodable' 协议需要初始化器 'init(from:)' 类型为 'Encodable'

标签: swiftcodable

解决方案


该问题是由于您将两个属性声明Response为隐式展开的选项 (IOU) 造成的。编译器无法自动生成CodableIOU 属性所需的方法。

但是,无论如何都没有必要制作这些借据。如果它们是响应中始终存在的必需属性,请将它们设为非可选。如果它们可能丢失,请制作它们Optional(使用?而不是!)。

此外,Swift 不是 Objective-C。没有必要让你的类型继承自NSObject. 除非您明确需要引用类型行为,否则您还应该使用structs 而不是es。class您还应该使所有属性不可变,除非您明确需要能够改变它们。

struct ErrorObj: Codable {
    let numError: Int
    let description: String
}

struct Response<T: Codable>: Codable {
    let error: ErrorObj
    let result: T

    func getResponse(errorObj: (ErrorObj) -> Void, successObj: (T) -> Void) {
        if error.numError != 0 {
            errorObj(error)
        } else{
            successObj(result)
        }
    }

}

推荐阅读