Xcode Swift 参数类型不符合预期类型 'Decoder'

Xcode Swift Argument type does not conform to expected type 'Decoder'

我在使用 "Decoder" 时遇到一点问题,我使用 URLSession 和 Xcode 11.3。这是错误消息参数类型 'Data' 不符合预期类型 'Decoder' 检查一下

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不是Model数组?

您可以打印出响应字符串来检查您的类型是否正确。

您的响应数据似乎与结构中的项目不匹配。评论只是回应

Optional( { 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 和 post。这将有助于我们回答

循环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成员可以是常量

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