SwiftUI: я получаю ошибку предварительного просмотра в Canvas при попытке загрузить локальные данные JSON - PullRequest
0 голосов
/ 23 октября 2019

В настоящее время я пытаюсь изучить JSON, начиная с локального Data в файле .json в моем приложении. Следуя инструкциям онлайн, я строю образец строки, которую затем помещаю в список. Data происходит из .json файла, который я создал в правильном формате.

Когда я пытаюсь просмотреть работу в Canvas, я получаю сообщение об ошибке:

Невозможно выполнить предварительный просмотр в этом файле - возможно, произошел сбой JSON Practice.app.

Я новичок в SwiftUI, а также в динамических списках и данных JSON, так что, возможно, кто-то из сообщества может показать мнегде я иду не так. Я везде смотрел онлайн, но не смог найти ответ на свой вопрос.

Искал в сети похожие проекты или учебные пособия, так что пока я не вижу никакой разницы в коде. Я также проверил SwiftUI Tutorials от Apple для Списков и Навигации, который показывает, как локально читать данные из файла JSON, но, хотя я использую почти такой же код, я получаю эту ошибку.

Мой JSONФайл выглядит следующим образом:

[
    {
        "id": 0,
        "name": "Salzburg",
        "image": "salzburg",
        "detail": "A small but beautiful Town in upper Austria",
    },
{
        "id": 1,
        "name": "Vienna",
        "image": "Vienna",
        "detail": "The Capital of Austria",
    },
{
        "id": 2,
        "name": "Linz",
        "image": "Linz",
        "detail": "The third largest town in Austria",
    }
]

Файл My Data выглядит следующим образом:

import SwiftUI

let citiesData: [City] = load("cities.json")

func load<T: Decodable>(_ filename: String, as type: T.Type = T.self) -> T {
    let data: Data

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil) else {
        fatalError("Couldn't find \(filename) in main bundle.")
    }

    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }

    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }
}

Файл My Decoder (не уверен, так ли это называется) Файл выглядит следующим образом:

import SwiftUI

struct City: Hashable, Codable, Identifiable {
    var id: Int
    var name: String
    var image: String
    var detail: String
}

И мой файл строки выглядит следующим образом:

import SwiftUI

struct CityRow: View {

    var city: City

    var body: some View {
        Text(city.name)
    }
}

struct CityRow_Previews: PreviewProvider {
    static var previews: some View {
        CityRow(city: citiesData[1])
    }
}

При предварительном просмотре файла строки в нем должно быть указано название первого города, но вместо этого выдается ошибка, как указано выше.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

В вашем массиве только одно значение из массива json, попробуйте

struct CityRow_Previews: PreviewProvider {
static var previews: some View {
    CityRow(city: citiesData[0])
}
}
0 голосов
/ 23 октября 2019

ОК, это тот момент, когда, я думаю, я чувствую себя действительно глупо. Оказывается, файл JSON был плохо сформирован, после строк подробностей не должно быть,

Спасибо за чтение и за помощь. Я надеюсь, что следующий человек сможет увидеть это и решить это быстрее, чем я

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...