Arreglo del map de objects al Diccionario en Swift

Tengo una variedad de objects de la Person :

 class Person { let name:String let position:Int } 

y la matriz es:

 let myArray = [p1,p1,p3] 

Quiero mapear myArray para ser un dictionary de [position:name] la solución clásica es:

 var myDictionary = [Int:String]() for person in myArray { myDictionary[person.position] = person.name } 

¿hay alguna forma elegante de Swift para hacerlo con el map enfoque funcional, flatMap … u otro estilo Swift moderno

Puede escribir un inicializador personalizado para tipo de Dictionary , por ejemplo de tuplas:

 extension Dictionary { public init(keyValuePairs: [(Key, Value)]) { self.init() for pair in keyValuePairs { self[pair.0] = pair.1 } } } 

y luego usa el map para tu matriz de Person :

 var myDictionary = Dictionary(keyValuePairs: myArray.map{($0.position, $0.name)}) 

Okay map no es un buen ejemplo de esto, ya que es igual que hacer un bucle, puede usar networkinguce , tomó cada uno de sus objects para combinar y convertirse en un solo valor:

 let myDictionary = myArray.networkinguce([Int: String]()) { (dict, person) -> [Int: String] in var dict = dict dict[person.position] = person.name return dict } //[2: "b", 3: "c", 1: "a"] 

Puede usar una function de networkingucción. Primero he creado un inicializador designado para la class Persona

 class Person { var name:String var position:Int init(_ n: String,_ p: Int) { name = n position = p } } 

Más tarde, he inicializado una matriz de valores

 let myArray = [Person("Bill",1), Person("Steve", 2), Person("Woz", 3)] 

Y finalmente, la variable del dictionary tiene el resultado:

 let dictionary = myArray.networkinguce([Int: Person]()){ (total, person) in var totalMutable = total totalMutable.updateValue(person, forKey: total.count) return totalMutable }