Поскольку ключи в json являются Decodable
дружественными, вы можете использовать этот минимальный код,
struct ProductResponse: Decodable {
let products: [Product]
}
struct Product: Decodable {
let foo: String
let bar: String?
}
let dataTask = URLSession.shared.dataTask(with: myURL) { (data, response, error) in
guard let data = data else { return }
do {
let productResponse = JSONDecoder().decode(ProductResponse.self, from: data)
print(productResponse.products.forEach({ print($0.foo)}))
} catch {
print ("Error: \(error)")
}
}
Назначение значения по умолчанию для bar
на уровне синтаксического анализа не кажется естественным.Product
- это простой тип с двумя свойствами, но для типа с десятками свойств вам не понравится реализация init(from decoder: Decoder)
и CodingKeys
enumerations
только из-за одного или двух свойств, которым необходимо значение по умолчанию.
Я бы предложил лучший подход, введя от extension
до Optional
, как показано ниже,
extension Optional where Wrapped == String {
/// Unwrapped string
/// `u7d` comes from starting `u` in `Unwrapped`,
/// 7 letters in between and last letter `d`.
public func u7d(_ defaultString: String = "N/A") -> String {
guard let value = self, value.isEmpty == false else { return defaultString }
return value
}
}
Так что теперь, когда вы хотите использовать значение по умолчанию value
, если это свойство nil
, вы можете просто развернуть его, передав значение по умолчанию value
, как показано ниже,
productResponse.products.forEach({ product in
print(product.bar.u7d("Not Available"))
})
Это имеет некоторые ключевые преимущества, как показано ниже,
- Ваш результат
if statement
останется ожидаемымкогда вы сравните это необязательное свойство с nil
. - Вы можете передавать различные значения по умолчанию в разных местах без
if statement
. - как
UITextField
, UITextView
и UILabel
примите Optional
текст, и во многих случаях вам нужно будет показать placeholder
, когда атрибут string
равен nil
из ответа API.Таким образом, в этих случаях вам не нужно перепроектировать атрибут string
, чтобы узнать, имеет ли он значение по умолчанию или значение, возвращаемое API.