Когда я получаю данные из API, он возвращает меня, как показано ниже JSON (ответ)
{
"brand": "",
"item": [
{
"name": "ABC",
"url": "https..."
},
{
"name": "ABC",
"url": "https..."
},
{
"name": "ABC",
"url": ""
},
{
"name": "ABC",
"url": "https..."
},
{
"name": "ABC",
"url": "https..."
}
]
}
Мои ожидания: Если item.url == "", то элемент будет немедленно удален.
После удаления:
{
"brand": "",
"item": [
{
"name": "ABC",
"url": "https..."
},
{
"name": "ABC",
"url": "https..."
},
{
"name": "ABC",
"url": "https..."
},
{
"name": "ABC",
"url": "https..."
}
]
}
struct DataDetail {
var brand:Brand
var items: [Item]
struct Brand {
let title: String?
let image: URL?
}
public struct Item {
let name: String
let url: URL?
}
}
var dataDetail1: DataDetail
fetchAPI { [weak self] response in
self.dataDetail1 = response
}
Как я могу отфильтровать (ответ), чтобы он отображался так, как ожидалось? Если item.url == "", то элемент будет немедленно удален.
Почему бы не обновить оба образца? И, пожалуйста, ответьте на мой вопрос.
Вы можете просто понять, что: я хочу удалить 1 элемент в элементе (если item.url пуст)
self.dataDetail1 = DataDetail(brand: response.brand, items: response.items.filter { DoTheFilterHere })
, теперь, поскольку url
является необязательным, это ноль?
@Larme это необязательно, если оно равно нулю, оно будет удалено из элемента в элементе.
Тогда DoTheFilterHere
это $0.url != nil
? Или я не понимаю тест, который вы хотите сделать. потому что пустая строка не является допустимой URL
.
При декодировании в свой тип вы можете добавить пользовательскую инициализацию для удаления пустых строк и нулей.
struct Brand: Codable {
let brand: String
var item: [Item]
enum CodingKeys: String, CodingKey {
case brand
case item
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
brand = try container.decode(String.self, forKey: .brand)
var items = try container.decode([Item].self, forKey: .item)
items = items.filter { $0.url != nil } //remove nil
items.removeAll { $0.url!.isEmpty } //remove empty
item = items
}
}
Теперь я заметил, что ни один из ваших типов не соответствует Codable и что образец json с "" для бренда выглядит странно. Как вы в настоящее время конвертируете json в свои пользовательские типы?