Filtrar una matriz basada en el valor vacío en Swift

Estoy intentando filtrar una variedad de dictionarys. El código siguiente es la muestra del escenario que estoy buscando

let names = [ [ "firstName":"Chris","middleName":"Alex"], ["firstName":"Matt","middleName":""], ["firstName":"John","middleName":"Luke"], ["firstName":"Mary","middleName":"John"], ] 

El resultado final debe ser un set para el que haya un segundo nombre.

Esto hizo el truco

 names.filter { if let middleName = $0["middleName"] { return !middleName.isEmpty } return false } 

También puede usar el operador nil-coalescing para express esto de manera bastante sucinta:

 let noMiddleName = names.filter { !($0["middleName"] ?? "").isEmpty } 

Esto reemplaza los nombres intermedios ausentes con cadenas vacías, por lo que puede manejar usando .isEmpty (y luego negar si desea search aquellos con nombres intermedios).

También puede usar el encadenamiento opcional y el operador nil-coalescing para expresslo de otra manera:

 let noMiddleName = names.filter { !($0["middleName"]?.isEmpty ?? true) } 

$0["middleName"]?.isEmpty llamará isEmpty si el valor no es nil , pero devuelve un opcional (porque podría haber sido nil ). Entonces usas ?? Sustituir true por nil .

Ligeramente más corto:

 let result = names.filter { $0["middleName"]?.isEmpty == false } 

Esto maneja los tres casos posibles:

  • Si el segundo nombre existe y no es una cadena vacía, entonces $0["middleName"]?.isEmpty evalúa como false y el pnetworkingicado devuelve true .
  • Si el segundo nombre existe y es una cadena vacía, entonces $0["middleName"]?.isEmpty evalúa como true y el pnetworkingicado devuelve false .
  • Si el segundo nombre no existe , entonces $0["middleName"]?.isEmpty evalúa a nil y el pnetworkingicado devuelve false (porque nil ! = false ).

Esto también funciona bien.

 names.filter { if let middleName = $0["middleName"] { return middleName != "" } return false }