类型 'Response' 不符合协议 'Decodable' \ 'Encodable'
Type 'Response' does not conform to protocol 'Decodable' \ 'Encodable'
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)
}
}
}
错误:
Cannot automatically synthesize 'Decodable' because 'T?' does not conform to 'Decodable'
Protocol requires initializer 'init(from:)' with type 'Decodable'
Cannot automatically synthesize 'Decodable' because 'T?' does not conform to 'Encodable'
Protocol requires initializer 'init(from:)' with type 'Encodable'
问题是由于您将 Response
的两个属性都声明为隐式展开的可选值 (IOU)。编译器无法为 IOU 属性自动生成 Codable
所需的方法。
不过,反正也没必要开那些欠条。如果它们是响应中始终存在的必需属性,请将它们设置为非可选属性。如果它们可能丢失,请将它们设为 Optional
(使用 ?
而不是 !
)。
此外,Swift 不是 Objective-C。没有必要让你的类型继承自 NSObject
。除非您明确需要引用类型行为,否则您还应该使用 struct
s 而不是 class
es。您还应该使所有属性不可变,除非您明确需要能够改变它们。
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)
}
}
}
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)
}
}
}
错误:
Cannot automatically synthesize 'Decodable' because 'T?' does not conform to 'Decodable' Protocol requires initializer 'init(from:)' with type 'Decodable'
Cannot automatically synthesize 'Decodable' because 'T?' does not conform to 'Encodable' Protocol requires initializer 'init(from:)' with type 'Encodable'
问题是由于您将 Response
的两个属性都声明为隐式展开的可选值 (IOU)。编译器无法为 IOU 属性自动生成 Codable
所需的方法。
不过,反正也没必要开那些欠条。如果它们是响应中始终存在的必需属性,请将它们设置为非可选属性。如果它们可能丢失,请将它们设为 Optional
(使用 ?
而不是 !
)。
此外,Swift 不是 Objective-C。没有必要让你的类型继承自 NSObject
。除非您明确需要引用类型行为,否则您还应该使用 struct
s 而不是 class
es。您还应该使所有属性不可变,除非您明确需要能够改变它们。
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)
}
}
}