类型“响应”不符合协议“可解码” \“可编码”

时间:2020-07-08 14:25:56

标签: swift codable

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

错误:

由于“ T”,无法自动合成“可解码”。不符合“可降解” 协议需要类型为“可解码”的初始化程序“ init(from :)”

由于“ T”,无法自动合成“可解码”。不符合“可编码” 协议要求类型为'Encodable'的初始化程序'init(from:)'

1 个答案:

答案 0 :(得分:0)

此问题是由于您将Response的两个属性都声明为隐式未包装的可选内容(IOU)引起的。编译器无法为IOU属性自动生成Codable所需的方法。

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

此外,Swift不是Objective-C。无需使您的类型继承自NSObject。除非明确需要引用类型行为,否则还应该使用struct而不是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)
        }
    }

}