Array de búsqueda de dictionarys para el valor en Swift

Soy nuevo en Swift y tomo una class para aprender la progtwigción iOS. Me encuentro perplejo en cómo search en una matriz de dictionarys para un valor de cadena y volcar el valor de cadena en una matriz. Esto se toma de mi patio Xcode.

Estoy tratando de averiguar cómo: 1) search a través de una variedad de dictionarys 2) volcar los resultados de la búsqueda en una matriz (que he creado)

Estos son los dictionarys de caracteres.

let worf = [ "name": "Worf", "rank": "lieutenant", "information": "son of Mogh, slayer of Gowron", "favorite drink": "prune juice", "quote" : "Today is a good day to die."] let picard = [ "name": "Jean-Luc Picard", "rank": "captain", "information": "Captain of the USS Enterprise", "favorite drink": "tea, Earl Grey, hot"] 

Esta es una matriz de los dictionarys de caracteres que se enumeran arriba.

 let characters = [worf, picard] 

Esta es la function que estoy tratando de escribir.

 func favoriteDrinksArrayForCharacters(characters:Array<Dictionary<String, String>>) -> Array<String> { // create an array of Strings to dump in favorite drink strings var favoriteDrinkArray = [String]() for character in characters { // look up favorite drink // add favorite drink to favoriteDrinkArray } return favoriteDrinkArray } let favoriteDrinks = favoriteDrinksArrayForCharacters(characters) favoriteDrinks 

Agradecería cualquier ayuda sobre cómo avanzar en esto. He buscado ejemplos, pero no voy a encontrar uno que sea aplicable a lo que estoy tratando de hacer aquí.

Dentro del ciclo, debe search la input "bebida favorita" del dictionary y agregarla a la matriz:

 for character in characters { if let drink = character["favorite drink"] { favoriteDrinkArray.append(drink) } } 

Tenga en count que if let drink = the if let drink = guarda contra la posibilidad de que no exista tal input en el array, si no lo hace, obtendrá un nil atrás, y el if está comprobando eso, solo agregando la input si no es nula.

Es posible que a veces veas que la gente omite la parte if let y en lugar de eso simplemente escribe let drink = character["favorite drink"]! , con un signo de exclamación al final. No hagas esto Esto se conoce como "force unwrapping", un opcional, y si no hay un valor válido devuelto por el dictionary, su progtwig se bloqueará.

El comportamiento con el primer ejemplo es que, si no hay bebida, no lo agregues a la matriz. Pero esto podría no ser lo que desea, ya que puede estar esperando una correspondencia de 1 a 1 entre las inputs en la matriz de caracteres y las inputs en la matriz de bebidas.

Si ese es el caso, y tal vez quieras una cadena vacía, puedes hacer esto en su lugar:

 func favoriteDrinksArrayForCharacters(characters: [[String:String]]) -> [String] { return characters.map { character in character["favorite drink"] ?? "" } } 

El .map significa: ejecutar todas las inputs en characters y poner el resultado de ejecutar esta expresión en una nueva matriz (que luego devuelve).

El ?? significa: si devuelve un nil desde el lado izquierdo, cámbielo por el valor en el lado derecho.

La respuesta de Airspeed Velocity es muy completa y proporciona una solución que funciona. Una forma más compacta de lograr el mismo resultado es usar los methods de filter y map de matrices rápidas:

 func favoriteDrinksArrayForCharacters(characters:Array<Dictionary<String, String>>) -> Array<String> { // create an array of Strings to dump in favorite drink strings return characters.filter { $0["favorite drink"] != nil }.map { $0["favorite drink"]! } } 

El filter toma un cierre devolviendo un boolean, que indica si un elemento debe estar incluido o no, en nuestro caso, comtesting la existencia de un elemento para la "favorite drink" key. Este método devuelve la matriz de dictionarys que satisface esa condición.

El segundo paso utiliza el método del map para transformar cada dictionary en el valor correspondiente a la key de " "favorite drink ", teniendo en count que una búsqueda de dictionary siempre devuelve una opción (para tener en count la key que falta), y que el filter ya ha excluido a todos Los dictionarys que no tienen un valor para esa key, ¡es seguro aplicar el operador de desenvolvimiento forzado ! para devolver una cadena no opcional.

El resultado combinado es una serie de cadenas, copydas de mi patio de recreo:

 ["prune juice", "tea, Earl Grey, hot"] 
 let drinks = characters.map({$0["favorite drink"]}) // [Optional("prune juice"), Optional("tea, Earl Grey, hot")] 

o

 let drinks = characters.filter({$0["favorite drink"] != nil}).map({$0["favorite drink"]!}) // [prune juice, tea, Earl Grey, hot] 
  Use the following code to search from NSArray of dictionaries whose keys are ID and Name. var txtVal:NSString let path = NSBundle.mainBundle().pathForResource(plistName, ofType: "plist") var list = NSArray(contentsOfFile: path!) as [[String:String]] var namePnetworkingicate = NSPnetworkingicate(format: "ID like %@", String(forId)); let filtenetworkingArray = list.filter { namePnetworkingicate!.evaluateWithObject($0) }; if filtenetworkingArray.count != 0 { let value = filtenetworkingArray[0] as NSDictionary txtVal = value.objectForKey("Name") as String } 

Te puede ayudar

 var customerNameDict = ["firstName":"karthi","LastName":"alagu","MiddleName":"prabhu"]; var clientNameDict = ["firstName":"Selva","LastName":"kumar","MiddleName":"m"]; var employeeNameDict = ["firstName":"karthi","LastName":"prabhu","MiddleName":"kp"]; var attributeValue = "karthi"; var arrNames:Array = [customerNameDict,clientNameDict,employeeNameDict]; var namePnetworkingicate = NSPnetworkingicate(format: "firstName like %@",attributeValue); let filtenetworkingArray = arrNames.filter { namePnetworkingicate.evaluateWithObject($0) }; println("names = ,\(filtenetworkingArray)"); 

Tengo una variedad de clientes, cada cliente tiene nombre, número de teléfono y otros talones. Por lo tanto, usé el código siguiente para search por número de teléfono en la matriz de dictionary en la barra de búsqueda

  for index in self.customerArray { var string = index.valueForKey("phone") if let phoneNumber = index.valueForKey("phone") as? String { string = phoneNumber } else { string = "" } if string!.localizedCaseInsensitiveContainsString(searchText) { filtenetworking.addObject(index) searchActive = true; } }