Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

183
Vistas
ignorar el objeto nulo en la matriz cuando se analiza con Codable swift

estoy analizando esta API con Swift Codable

 "total": 7, "searchResult": [ null, { "name": "joe" "family": "adam" }, null, { "name": "martin" "family": "lavrix" }, { "name": "sarah" "family": "mia" }, null, { "name": "ali" "family": "abraham" } ]

con este modelo de PaginationModel :

 class PaginationModel<T: Codable>: Codable { var total: Int? var data: T? enum CodingKeys: String, CodingKey { case total case data = "searchResult" } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.total = try container.decodeIfPresent(Int.self, forKey: .total) self.data = try container.decodeIfPresent(T.self, forKey: .data) } }

y modelo User :

 struct User: Codable { var name: String? var family: String? }

Llamo a jsonDecoder así para analizar API json:

 let responseObject = try JSONDecoder().decode(PaginationModel<[User?]>.self, from: json)

ahora mi problema es null en searchResult Array. se analizó correctamente y cuando accedí a data en paginationModel encontré null en la matriz.

¿Cómo puedo ignorar todos null al analizar la API y el resultado será una matriz sin ningún null

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

En primer lugar, recomendaría considerar siempre que PaginationModel se compone de matrices. No tiene que pasar [User] como tipo genérico, simplemente puede pasar User . Luego, el analizador puede usar el conocimiento de que analiza matrices y maneja null automáticamente:

 class PaginationModel<T: Codable>: Codable { var total: Int? var data: [T]? enum CodingKeys: String, CodingKey { case total case data = "searchResult" } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.total = try container.decodeIfPresent(Int.self, forKey: .total) self.data = (try container.decodeIfPresent([T?].self, forKey: .data))?.compactMap { $0 } } }

Es posible que desee eliminar los opcionales aquí y usar algunos valores predeterminados en su lugar:

 class PaginationModel<T: Codable>: Codable { var total: Int = 0 var data: [T] = [] enum CodingKeys: String, CodingKey { case total case data = "searchResult" } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.total = (try container.decodeIfPresent(Int.self, forKey: .total)) ?? 0 self.data = ((try container.decodeIfPresent([T?].self, forKey: .data)) ?? []).compactMap { $0 } } }
over 4 years ago · Santiago Trujillo Denunciar

0

Solución simple, filtrar data después de decodificar

 let responseObject = try JSONDecoder().decode(PaginationModel<[User?]>.self, from: data) responseObject.data = responseObject.data?.filter{$0 != nil}
over 4 years ago · Santiago Trujillo Denunciar

0

Puede agregar una verificación de tipo de matriz dentro de decode:

 required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.total = try container.decodeIfPresent(Int.self, forKey: .total) self.data = try container.decodeIfPresent(T.self, forKey: .data) //add the following: if let array = self.data as? Array<Any?> { self.data = ( array.compactMap{$0} as? T) } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda