Мои данные никогда не заполняют мой класс кодируемым протоколом - PullRequest
0 голосов
/ 15 января 2019

Я устанавливаю новый класс из строки, отформатированной как JSON. Когда я пытаюсь найти данные после работы кодируемого протокола внутри news.msg для примера, я ничего не нашел.

let jsonNews = """
[
{
"idPlace": "HexaId",
"namePlace": "A random name",
"dateMsg": "Timestamp",
"msg": "Message to display",
"urlPicture": "Url of the pic"
},
{
 "idPlace": "HexaId 2",
 "namePlace": "A random name 2",
 "dateMsg": "Timestamp 2",
 "msg": "Message to display 2",
 "urlPicture": "Url of the pic"
}
]
"""    

func getNews(){
var arrayNews: [News] = [News]()

if let dataFromString = jsonNews.data(using: .utf8, allowLossyConversion: false) {
    let json = try! JSON(data: dataFromString)
    for elem in json{
        debugPrint(elem.1)
        guard let data = try? elem.1.rawData() else {
            debugPrint("An error has occurred")
            return
        }
        guard let news = try? JSONDecoder().decode(News.self, from: data) else{
            debugPrint("An error has occurred")
            return

        }
        debugPrint(news.msg)
        arrayNews.append(news)
    }
}


import Foundation
import UIKit

class News: NSObject, Codable {
    let idPlace: String = ""
    let namePlace: String = ""
    let dateMsg: String = ""
    let msg: String = ""
    let urlPicture: String = ""
}

Когда я пытаюсь отобразить news.msg или любое другое свойство из класса News, пусто

1 Ответ

0 голосов
/ 15 января 2019

Поскольку ваш json - это просто массив объектов, цикл foreach не нужен, и вы можете просто указать, что результатом декодирования должен быть массив News, указав тип результата в квадратных скобках: [News].self

guard let news = try? JSONDecoder().decode([News].self, from: Data(jsonNews.utf8)) else {
    debugPrint("An error has occurred")
    return
}

debugPrint(news)
arrayNews = news

Кроме того, если нет конкретной причины, по которой ваша модель должна наследоваться от NSObject, вы можете упростить ее, сделав ее struct. Также вам не нужны значения по умолчанию, так как все значения будут назначаться инициализатором декодера

struct News: Decodable {
    let idPlace, namePlace, dateMsg, msg, urlPicture: String
}
...