Ошибка не связана с типом содержимого.
Вместо того, чтобы игнорировать ошибку в catch
блоке print it, ошибки декодирования очень описательны.
} catch {
print(error)
completionHandler([])
}
В нем указывается
keyNotFound (CodingKeys (stringValue: "smallUrl", intValue: nil), Swift.DecodingError.Context (codingPath: [_JSONKey (stringValue: "Index 0", intValue:0)], debugDescription: "Нет значения, связанного с ключом CodingKeys (stringValue: \" smallUrl \ ", intValue: nil) (\" smallUrl \ ").", UnderError: nil))
Вы сразу видите, что ключ small_url
, а ваш член структуры - smallUrl
.
Самое простое решение - добавить стратегию декодирования ключа convertFromSnakeCase
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let livePhotos = try decoder.decode([LivePhoto].self, from: data)
И выне нужен метод init
в классе.Объявите это как структуру с постоянными членами
struct LivePhoto: Decodable {
let smallUrl, largeUrl, movieUrl: String
let id: Int
let isLocked: Bool
let promotionalUnlock: Bool
}
И, пожалуйста, удалите это ужасное semaphore
.Так как вы все равно используете обработчик завершения, это бессмысленно.