swift 3 array de filters de dictionarys por valor de cadena de key en dictionary

Tengo una class como esta

class FoundItem : NSObject { var id : String! var itemName : String! var itemId : Int! var foundBy : String! var timeFound : String! init(id: String, itemName: String, itemId: Int, foundBy: String, timeFound: String) { self.id = id self.itemName = itemName self.itemId = itemId self.foundBy = foundBy self.timeFound = timeFound } 

y lo referenceo en mi

 class MapViewVC: UIViewController, MKMapViewDelegate { var found = [FoundItem]() var filterItemName : String() } 

My FoundItem se generan en una matriz de dictionarys de mi class de FoundItem desde una consulta de FoundItem de firebase. Luego obtengo una cadena de ese itemName que se genera desde un controller de otra vista que es una vista de colección en la function didSelection . Quiero tomar esa cadena y luego filtrar o search en las matrices con la cadena itemName que es igual a la cadena itemName de mi viewController anterior. A continuación, eliminó la matriz de dictionarys que no son iguales a itemName . No solo los objects, sino todo el set que contiene una key no igual, par de valores. He buscado días y estoy atrapado en filtrar una variedad de dictionarys creados de una class. He buscado y probado NSPnetworkingicates, for-in loops, pero todo lo que termina sucediendo es crear una nueva matriz o bool que encuentre que mis valores o keys son iguales. Aquí está la function actual que he escrito.

 func filterArrayBySearch() { if self.filterItemName != nil { dump(found) let namePnetworkingicate = NSPnetworkingicate(format: "itemName like %@", "\(filterItemName)") let nameFilter = found.filter { namePnetworkingicate.evaluate(with: $0) } var crossRefNames = [String: [FoundItem]]() for nameItemArr in found { let listName = nameItem.itemName let key = listName if crossRefNames.index(forKey: key!) != nil { crossRefNames[key!]?.append(nameItemArr) if !("\(key)" == "\(filterItemName!)") { print("------------- Success have found [[[[[[ \(key!) ]]]]]] and \(filterItemName!) to be equal!!") // crossRefNames[key!]?.append(nameItemArr) } else { print("!! Could not find if \(key!) and \(filterItemName!) are equal !!") } } else { crossRefNames[key!] = [nameItemArr] } } } else { print("No Data from Search/FilterVC Controller") } } 

¿Alguien puede ayudar? Parece que sería la tarea simple encontrar el valor y luego filtrar los dictionarys que no son iguales a la cadena itemName , pero sigo golpeando una panetworking. Y ejecutando loops for-in por mí: P intentando cosas diferentes para lograr la misma tarea.

Espero haber entendido lo que estabas preguntando. Menciona una "variedad de dictionarys", pero en realidad no tiene una variedad de dictionarys en el código que haya publicado.

Por lo que puedo decir, estás preguntando cómo encontrar todas las inputs en la matriz found para qué itemName es igual a la propiedad filterItemName .

Si es así, todo lo que debe hacer es:

let foundItems = found.filter { $0.itemName == filterItemName }

Eso es.


Algunas otras ideas:

Si desea search elementos donde filterItemName está contenido en itemName , puede hacer algo como esto:

let foundItems = found.filter { $0.itemName.contains(filterItemName) }

También puede utilizar la function lowercased() si desea realizar búsquedas sin distinción entre mayúsculas y minúsculas.

También puede devolver las properties de los elementos encontrados en una matriz:

let foundIds = found.filter { $0.itemName == filterItemName }.map { $0.itemId }