Obtenga todos los valores de una key en particular de un dictionary en Swift

Tengo una variedad de dictionarys como este.

let arr = [["EmpName" : "Alex", "Designation" : "Jr. Developer"], ["EmpName" : "Bob", "Designation" : "Sr. Developer"], ["EmpName" : "Clair", "Designation" : "Jr. Developer"], ["EmpName" : "David", "Designation" : "Project Manager"]] 

Ahora quiero search solo los objects EmpName de esto. ¿Cómo hago esto de manera rápida? Básicamente quiero una matriz que tenga los siguientes valores.

 ["Alex", "Bob", "Clair", "David"] 

Esto es lo que hago ahora. Pero me pregunto si podría hacer eso en una sola como usando filter o map

 var employees = [String]() for empRecord in arr { employees.append(empRecord["EmpName"]!) } 

Una forma simple es usar flatMap :

 let employees = arr.flatMap { $0["EmpName"] } 

Resultado:

["Alex", "Bob", "Clair", "David"]

flatMap en Swift es como un map pero también desenvuelve de manera segura los optionals, que es lo que necesitamos aquí, ya que los dictionarys Swift siempre devuelven Optionals.

Aquí hay dos forms de hacerlo. Si eres genial con el uso de NSArray, soy un fanático de esa solución.

 let arr = [["EmpName" : "Alex", "Designation" : "Jr. Developer"], ["EmpName" : "Bob", "Designation" : "Sr. Developer"], ["EmpName" : "Clair", "Designation" : "Jr. Developer"], ["EmpName" : "David", "Designation" : "Project Manager"]] let names = arr.map { (dictionary) -> String? in return dictionary["EmpName"] } // names now contains array of names as String? // If you want to use NSArray let newArray = arr as NSArray let newNames = newArray.valueForKeyPath("EmpName") // newNames now contains array of names as String