Как исправить: не удается преобразовать значение типа: GameData — Codeable в ожидаемые данные аргумента

#swift #function #data-conversion

#swift #функция #преобразование данных

Вопрос:

Я пытаюсь декодировать мой ответ JSON data из type: AnyObject? обратно во что-то, что можно распечатать в консоли / взаимодействовать с ним.

считывание данных перед декодированием печатает projectName.GameData

Вот разбивка, данные возвращаются из ответа как тип: Any? потому что он отправлен как

 
class GameData : Codable {

    var isPlayerOneTurn: Bool!
    var wasCreated: Bool!
    var playerOne: String!
    var playerTwo: String!
    var board: [[Int]]!

   init() {

    }
}
 

Текущая ошибка, которую я получаю при попытке декодирования Cannot convert value of type 'GameData' to expected argument type 'Data'

код :

 let decoder = JSONDecoder()
let dataTest = try? decoder.decode(GameData.self, from: data)
 

Мне не хватает правильного метода init() в классе GameData?

ОБНОВЛЕНИЕ: данные были изменены на тип Data здесь: спасибо @rmaddy за комментарий, указывающий на это.

  let data = data as? Data

 let decoder = JSONDecoder()
 let dataTest = try? decoder.decode(GameData.self, from: data!)

 print("data: (String(describing: dataTest))")

 

строка печати по-прежнему показывает data: Optional(projectName.GameData)

Что здесь не так, что не позволяет мне просматривать значения класса GameData?

Комментарии:

1. data должно быть типа Data .

2. Добавьте description метод в свой GameData класс. КСТАТИ — GameData вероятно, это должна быть структура, а не класс.

3. совет: хотя вы НЕ должны делать ни того, ни другого, вы можете сделать data as! Data так, чтобы вам не нужно было этого делать data! . Но вместо этого я бы поставил a guard с ошибкой утверждения.

4. @Kubee спасибо за ответ! воспользуюсь этим советом.

Ответ №1:

Строка печати, упомянутая в вопросе, была значением декодирования игрового объекта.. Это было все, что XCode распечатал — имя исходного объекта перед декодированием. Использование dataTest.myValue работало при доступе к данным из объекта.