Desde Swift 4 puedes hacer esto muy fácilmente. Hay dos nuevos inicializadores que crean un diccionario a partir de una secuencia de tuplas (pares de clave y valor). Si se garantiza que las claves son únicas, puede hacer lo siguiente:
let persons = [Person(name: "Franz", position: 1),
Person(name: "Heinz", position: 2),
Person(name: "Hans", position: 3)]
Dictionary(uniqueKeysWithValues: persons.map { ($0.position, $0.name) })
=> [1: "Franz", 2: "Heinz", 3: "Hans"]
Esto fallará con un error de tiempo de ejecución si se duplica alguna clave. En ese caso, puede utilizar esta versión:
let persons = [Person(name: "Franz", position: 1),
Person(name: "Heinz", position: 2),
Person(name: "Hans", position: 1)]
Dictionary(persons.map { ($0.position, $0.name) }) { _, last in last }
=> [1: "Hans", 2: "Heinz"]
Esto se comporta como su bucle for. Si no desea "sobrescribir" los valores y ceñirse al primer mapeo, puede usar esto:
Dictionary(persons.map { ($0.position, $0.name) }) { first, _ in first }
=> [1: "Franz", 2: "Heinz"]
Swift 4.2 agrega un tercer inicializador que agrupa elementos de secuencia en un diccionario. Las claves del diccionario se derivan de un cierre. Los elementos con la misma clave se colocan en una matriz en el mismo orden que en la secuencia. Esto le permite lograr resultados similares a los anteriores. Por ejemplo:
Dictionary(grouping: persons, by: { $0.position }).mapValues { $0.last! }
=> [1: Person(name: "Hans", position: 1), 2: Person(name: "Heinz", position: 2)]
Dictionary(grouping: persons, by: { $0.position }).mapValues { $0.first! }
=> [1: Person(name: "Franz", position: 1), 2: Person(name: "Heinz", position: 2)]
[position:name]
o[position:[name]]
? Si tiene dos personas en la misma posición, su diccionario solo mantendrá la última encontrada en su bucle ... Tengo una pregunta similar para la que estoy tratando de encontrar una solución, pero quiero que el resultado sea como[1: [p1, p3], 2: [p2]]