Mapper un tableau d'objets au Dictionnaire dans Swift
J'ai un tableau de Person
'objets:
class Person {
let name:String
let position:Int
}
et le tableau est:
let myArray = [p1,p1,p3]
Je veux la carte myArray
être un Dictionnaire de [position:name]
la solution classique est:
var myDictionary = [Int:String]()
for person in myArray {
myDictionary[person.position] = person.name
}
est-il de toute manière élégante par Swift à le faire avec l'approche fonctionnelle map
flatMap
... ou d'autres modernes Swift style
source d'informationauteur iOSGeek
Vous devez vous connecter pour publier un commentaire.
Bon
map
n'est pas un bon exemple, parce que sa vient de même que la boucle, vous pouvez utiliserreduce
au lieu de cela, il a fallu à chacun de vos objets à combiner et de les transformer en valeur unique:Dans
Swift 4
vous pouvez le faire @Tj3n approche plus proprement et efficacement à l'aide de lainto
version dereduce
Il se débarrasse de la temporaire de dictionnaire et de la valeur de retour de sorte qu'il est plus rapide et plus facile à lire.Note: Ne fonctionne pas dans Swift 3.
Vous pouvez écrire personnalisé initialiseur pour
Dictionary
type, par exemple à partir des n-uplets:et ensuite utiliser
map
pour votre tableau dePerson
:Depuis Swift 4 vous pouvez le faire très facilement. Il y a deux nouveau initialiseurs que construire un dictionnaire à partir d'une séquence de n-uplets (paires de clés et de valeurs). Si les clés sont uniques, vous pouvez effectuer les opérations suivantes:
=>
[1: "Franz", 2: "Heinz", 3: "Hans"]
Cela échouera avec une erreur d'exécution si une touche est dupliqué. Dans ce cas, vous pouvez utiliser cette version:
=>
[1: "Hans", 2: "Heinz"]
Il se comporte comme votre boucle for. Si vous ne voulez pas "écraser" les valeurs et le bâton à la première cartographie, vous pouvez utiliser ceci:
=>
[1: "Franz", 2: "Heinz"]
Swift 4.2 ajoute un troisième initialiseur qui prend les éléments de la séquence comme dictionnaire des valeurs. Les clés de dictionnaire sont dérivées à partir des valeurs avec une fermeture. Par exemple:
=>
[1: Person(name: "Franz", position: 1), 2: Person(name: "Heinz", position: 2), 3: Person(name: "Hans", position: 3)]
Vous pouvez utiliser une fonction de réduction. Tout d'abord j'ai créé un désigné d'initialiseur de la classe Personne
Plus tard, j'ai initialisé un Tableau de valeurs
Et enfin, le dictionnaire de la variable a le résultat:
C'est ce que j'ai été en utilisant
Serait bien si il y avait un moyen de combiner les 2 dernières lignes de sorte que
peopleByPosition
pourrait être unlet
.Nous pourrions faire une extension de Tableau qui n'a que!
Alors nous pouvons simplement faire