[英]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)
}
}
}
錯誤:
無法自動合成“Decodable”,因為“T?” 不符合 'Decodable' 協議需要初始化器 'init(from:)' 類型為 'Decodable'
無法自動合成“Decodable”,因為“T?” 不符合 'Encodable' 協議需要初始化器 'init(from:)' 類型為 '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)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.