Моя структура инициализируется в ноль из JSON, но позже необходимо добавить значение - PullRequest
0 голосов
/ 02 марта 2019

Я использую следующую структуру для чтения из JSON.

struct ConsumedRecipe: Codable {

    var name: String
    var userStats: Stats?
    var globalStats: Stats?

    struct Stats: Codable {
        var rating: Double?
        var time: TimeInterval?
    }


    init(name: String, userStats: Stats, globalStats: Stats) {
        self.name = name
        self.userStats = userStats
        self.globalStats = globalStats
    }

}

Предположим, что у globalStats есть считанные значения, а у userStats нет.Таким образом, они равны нулю.

При выполнении приложения я получаю значение для userStats.rating.Если я попытаюсь присвоить рейтинг напрямую, он останется равным нулю.

Например:

userStats.rating = 2.0 remains nil.

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

 var tempStats: Stats! = Stats()
        tempStats.rating = 2.0

      userStats? = tempStats

Это все равно оставляет значение userStats.rating равным nil.

Что мне здесь не хватает?Я правильно понимаю, что это какая-то проблема инициализации?

Дополнительная информация:

Я думаю, что моя проблема может быть связана с кодом инициализации, инициируемым из JSON: Следующее:

  init?(json: Data) // take some JSON and try to init a ConsumedRecipe from it
    {
       do {
        let newValue =  try JSONDecoder().decode(ConsumedRecipe.self, from: json)
        self = newValue
    } catch let error as NSError {
        print("Reading Recipe Failed: \(error)")
        return nil
    }
}

Те, которые означают, что я не могу эту часть (userStats) позже?

1 Ответ

0 голосов
/ 02 марта 2019

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

Я решил проблему довольно не элегантным способом.Но поверьте, я понимаю причину.Я разрешаю Swift читать в файле JSON, как указано выше "init? (Json: Data)".Это работает хорошо, так как на самом деле есть несколько деталей файла JSON, не включенных в приведенный выше пример.Это экономит на написании полной логики JSON - особенно для обработки нулей.Однако нулевые значения могут привести к сбою чтения.Поэтому пользовательский рейтинг (который будет нулевым) отсутствует в файле JSON.Следовательно, структура Stats не инициализируется в чтении.И при этом он не может быть инициализирован позже, когда это необходимо(После того, как пользователь дал отзыв о рейтинге.)

Мое решение состояло в том, чтобы добавить в структуру необязательное свойство "code", как показано ниже:

  struct Stats: Codable {
        var code: String
        var rating: Double?
        var time: TimeInterval?
    }

Затем в JSON добавьте:

   "userStats": {
        "code":  "user"
    },

В настоящее время я не использую код свойства, но моя структура для userStats инициализируется с оценкой как ноль.Затем я могу позже добавить значение для рейтинга, когда это необходимо.

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