Преобразовать строку в [[String]] - PullRequest
0 голосов
/ 01 августа 2020

Я работаю с [[String]], чтобы заполнить ячейки представления моей коллекции.

Я получаю эти данные с помощью API:

{
  identifier: {
    channel: "WorldChannel",
    id: 1
  },
  message: {
    map: "[[null,null,\"penguin\",null,\"penguin\",null,null],[null,\"penguin\",\"penguin\",\"penguin\",\"orca...ll,null,\"penguin\",null,null,null],[\"penguin\",\"penguin\",\"penguin\",null,null,null,null,null]]"
  }
}

Для получения значения карты я использую:

struct ResponseData: Codable {
    let message: Message
}
struct Message: Codable {
    let map: String
}

Я пробовал работать с map как [[String]], но декодирование дало мне следующую ошибку: CodingKeys (stringValue: «map», intValue: nil)], debugDescription: «Ожидается декодирование массива, но вместо этого обнаружена строка / данные». Это кажется справедливым, поскольку значение map обернуто в " ", хотя то, что внутри, явно является двумерным массивом. Часть декодирования:

let jsonData = string.data(using: .utf8)!
let responseData = try! JSONDecoder().decode(ResponseData.self, from: jsonData)
mapAsString = responseData.message.map

print(maAsString!) приводит к:

[[null,"penguin","orca",...],...,[..."penguin",null,null]]

Я хочу сделать что-то вроде mapAs2DArray = mapAsString as! [[String]], но Xcode говорит, что он всегда терпит неудачу. Как я могу изменить тип данных? Как я могу заменить null на nil или любое другое значение для работы?

1 Ответ

1 голос
/ 01 августа 2020

Вам нужно преобразовать строку json в массив

 let data = Data(responseData.message.map.utf8)
 let arr = try JSONDecoder().decode([[String?]].self,from:data)
 let filtered  = arr.map { $0.compactMap{ $0 } } // remove null values 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...