簡體   English   中英

類型“響應”不符合協議“可解碼”\“可編碼”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM