Приложение xift 4 xcode не читает в файле json - PullRequest
0 голосов
/ 03 июля 2018

Итак, у меня есть пейджинговое приложение с 3 страницами, и у каждой страницы есть подробное представление. Все три страницы (представления) имеют доступ к отдельным файлам данных json. Все работало нормально, пока я не настроил третий вид страницы и подробный вид. Теперь приложение не может получить доступ к файлу JSON для второго просмотра. Он получает путь к файлу и генерирует локальный URL-адрес для файла, но либо не находит файл, либо не извлекает из него данные. Ниже приведен код:

func downloadJSON(completed: @escaping () -> ()) {
    let path = Bundle.main.path(forResource: "Speedways", ofType: "json")
    let url = URL(fileURLWithPath: path!)

    URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data, error == nil, response != nil else {
            return
        }
        do {
            let decoder = JSONDecoder()
            allspeedways = try decoder.decode([Speedways].self, from: data)
            var s = 0
            for speedway in allspeedways {
                self.TableData.append(speedway[s].speedway.capitalized)
                s += 1
            }
        } catch {
            print(error)
        }
    }.resume()
    DispatchQueue.main.async {
        completed()
    }
}

Это модель данных:

typealias Speedways = [Speedway]

struct Speedway: Codable {
    let speedway, location, sizeOfTrack: String
    let trackEvents, trackevents: [Trackevent]?

    enum CodingKeys: String, CodingKey {
        case speedway = "Speedway"
        case location = "Location"
        case sizeOfTrack = "SizeOfTrack"
        case trackEvents = "TrackEvents"
        case trackevents
    }
}

struct Trackevent: Codable {
    let trackevent, date, pole, winner: String
    let playoff: String
}

А это данные json (почему это странно, я не знаю):

[{"Speedway":"Daytona International Speedway",
"Location":"Daytona, Fla",
"SizeOfTrack":"2.5 miles",
"TrackEvents" :[{
        "trackevent" : "Advance Auto Parts CLASH AT DAYTONA",
        "date" : "Sun, Feb 11",
        "pole" : "Austin Dillon",
        "winner" : "Brad Keselowski",
        "playoff" : "No"
        },
        .
        .
        .
        {
          .
          .
          .
        }]
 },
 {
 "Speedway":"Atlanta Motor Speedway",
 "Location":"Hampton, Ga",
 "SizeOfTrack":"1.54 miles",
 "trackevents" :[{
        "trackevent" : "Folds of Honor QuikTrip 500",
        "date" : "Sun, Feb 25",
        "pole" : "Kyle Busch",
        "winner" : "Kevin Harvick",
        "playoff" : "No"
        }]
 },

Ошибка появляется здесь во время выполнения с сообщением: «Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения»

    speedwaysTableView.delegate = self
    speedwaysTableView.dataSource = self

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 03 июля 2018

Почему, ради всего святого, вы загружаете данные в комплекте с URLSession? Локальный файл можно прочитать без подключения к интернету ?

Удалите typealias и получите данные с помощью

func downloadJSON() { // the name of the function is pretty misleading
    let url = Bundle.main.url(forResource: "Speedways", withExtension: "json")!
    let data = try! Data(contentsOf: url)
    allspeedways = try! JSONDecoder().decode([Speedway].self, from: data)
    TableData = allspeedways.map{ $0.speedway.capitalized }
    // here reload the table view
}

В случае сбоя кода вы допустили ошибку проектирования.

А если speedwaysTableView.delegate = self падает, розетка не подключена в Интерфейсном Разработчике

...