簡體   English   中英

Xcode Swift Argument 類型不符合預期類型“解碼器”

[英]Xcode Swift Argument type does not conform to expected type 'Decoder'

我使用 URLSession 和 Xcode 11.3 的“解碼器”有一個小問題。 這是錯誤消息參數類型“數據”不符合預期類型“解碼器”檢查這一點

JSON

[
    {
        "id": 1,
        "titel": "Telefonständer",
        "ersteller": "von Mike-vom-Mars",
        "urlLink": "https://www.thingiverse.com/thing:3513800",
        "mehr": "Faltbarer Tablet- und Handyhalter, der fünf verschiedene Kipppositionen ermöglicht. Dieser Halter benötigt keine Schrauben, einfach ausdrucken und zusammenstecken. Sehr stabil, platzsparend und tragbar."
    },
    {
        "id": 2,
        "titel": "Tool Caddy",
        "ersteller": "von Tom Link",
        "urlLink": "https://www.thingiverse.com/thing:2849473",
        "mehr": "Ein einfacher Werkzeugwagen für den 3D-Druck. Ca. 4,75 x 3,125 x 1,3 Zoll. Hält Messer, Pinzetten, Rasierklingenschaber, Klebestift, SD-Kartenadapter und ein Abfallfach."
    },
    {
        "id": 3,
        "titel": "Honey, I'm Home!",
        "ersteller": "von Luz Cabrera und Malorie Pangilinan",
        "urlLink": "https://www.behance.net/gallery/16925735/Honey-Im-Home",
        "mehr": "Honig-Schlüsselanhänger. Wenn Sie direkt auf die endgültige Farbe drucken, empfehle ich, 100% für das Rahmenteil und 105% für die kleinen Teile zu verwenden, damit sie besser in die Löcher passen. Wenn Sie jedoch die Teile bemalen, empfehle ich 100% beide."
    }
]

func getRequest(completion: @escaping ([Model]?) -> Void) {
    let url = URL(string: "http://localhost" + ":" + "8080" + "/" + "printdata")!

    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in
        let jsonDecoder = JSONDecoder()
        if let data = data,
            var categories = try? jsonDecoder.decode([Model].self, from: data) {
            completion(categories)

            for reply in data{
                print("Show: \(reply)")
                categories.append(Model(from: data))

            }
        } else {
            print("ERROR")
            completion(nil)
        }
        //debugPrint(String(data: data!, encoding: .utf8))
    }
    task.resume()
}

還有我的模型:

struct Model: Decodable{
    var id: Int
    var titel: String
    var ersteller: String
    var mehr: String
    var urlLink: String?

    init(id: Int, titel: String, ersteller: String, mehr: String, urlLink: String) {
        self.id = id
        self.titel = titel
        self.ersteller = ersteller
        self.mehr = mehr
        self.urlLink = urlLink
    }

}

也許你得到的 JSON 不是模型數組?

您可以打印出響應字符串以檢查您的類型是否正確。

看來您的 responsedata 與結構中的項目不匹配。 評論只是回應

可選( { URL: localhost:8080/printdata } { Status Code: 200, Headers { Connection = ( "keep-alive" ); "Content-Length" = ( 1068 ); "Content-Type" = ( "application/json ; charset=utf-8" ); Date = ( "Tue, 14 Jan 2020 09:00:41 GMT" ); } ckquote

. 請將您獲得的數據轉換為 JSON/String 並在此處發布。 這將有助於我們回答

for reply in data循環沒有意義,數據已經完全解碼,刪除它,這修復了錯誤。

try? ,總是捕捉錯誤。

func getRequest(completion: @escaping ([Model]?) -> Void) {
    let url = URL(string: "http://localhost" + ":" + "8080" + "/" + "printdata")!

    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in
        if let error = error {
           print("Connection error", error)
           completion(nil)
        } else {
           do {
               let jsonDecoder = JSONDecoder()
               let categories = try jsonDecoder.decode([Model].self, from: data!)
               completion(categories)
           } catch {
               print("Decoding error", error)
               completion(nil)
           }
        }
        //debugPrint(String(data: data!, encoding: .utf8))
    }
    task.resume()
}

不需要Model的 init 方法,結構成員可能是常量

struct Model: Decodable {
    let id: Int
    let titel: String
    let ersteller: String
    let mehr: String
    let urlLink: String?
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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