Swift 类型“Response”不符合协议“Decodable”\“Encodable”

Swift 类型“Response”不符合协议“Decodable”\“Encodable”,swift,codable,Swift,Codable,错误: 无法自动合成“可解码”,因为“T”不符合“可解码” 协议要求初始值设定项“initfrom:”的类型为“Decodable” 无法自动合成“可解码”,因为“T”不符合“可编码” 协议要求初始值设定项“initfrom:”的类型为“Encodable” 问题的原因是您将响应的两个属性声明为隐式展开的optionals IOU。编译器无法为IOU属性自动生成所需的可编码方法 然而,无论如何,没有必要做那些借条。如果它们是响应中始终存在的必需属性,则将它们设置为非可选属性。如果它们可能不见了,

错误:

无法自动合成“可解码”,因为“T”不符合“可解码” 协议要求初始值设定项“initfrom:”的类型为“Decodable”

无法自动合成“可解码”,因为“T”不符合“可编码” 协议要求初始值设定项“initfrom:”的类型为“Encodable”


问题的原因是您将响应的两个属性声明为隐式展开的optionals IOU。编译器无法为IOU属性自动生成所需的可编码方法

然而,无论如何,没有必要做那些借条。如果它们是响应中始终存在的必需属性,则将它们设置为非可选属性。如果它们可能不见了,可以随意使用吗?而不是

此外,Swift不是Objective-C。不需要让您的类型从NSObject继承。除非明确需要引用类型行为,否则还应该使用结构而不是类。您还应该使所有属性都不可变,除非您明确需要能够对它们进行变异

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

您需要使ErrorObj也符合Codable.tnk的注释,这是我的类ErrorObj类ErrorObj:NSObject,Codable{var numeror:Int=0 var DescriptionError=}这是帮助我!!,非常感谢你!
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)
        }
    }

}