Swift dictionnaire de la clé pour la valeur
Je suis à l'aide d'un swift dictionnaire de type [UIImage:UIImage], et j'essaie de trouver une clé spécifique pour une valeur donnée. En Objective-C, je pourrais utiliser allKeysForValue, mais il ne semble pas d'une telle méthode pour une Swift dictionnaire. Que dois-je utiliser?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
allKeys(for:)
si vous avez jeté àNSDictionary
:let keys = (ItemDict as NSDictionary).allKeysForObject(orderItems[indexPath.row])
Ensuite, vous pouvez accéder comme:let someIntValue = keys[0].integerValue;
Fonctionne comme un rêve, merci!let keys = (dict as NSDictionary).allKeys(for: image) as! [UIImage]
Y est, autant que je sache, aucun intégré Swift fonction permettant d'obtenir toutes les clés de dictionnaire
pour une valeur donnée. Voici une implémentation possible:
La
filter
réduit toutes les paires clé-valeur à ceux avec la valeur donnée.Le
map
cartes de l' (filtré) les paires clé-valeur les touches seul.Exemple d'utilisation:
Mise à jour pour Swift 2: de Xcode 7 bêta 2, cela peut maintenant être réalisé
avec une méthode d'extension pour les dictionnaires de equatable valeurs
(merci à Vitesse Vitesse pour me faire prendre conscience de ce dans un commentaire):
Mise à jour pour Swift 3:
allKeys(forValue:)
est correct même en Swift 3. Les méthodes similaires de nommage sontindex(forKey:)
,update(value: forKey)
,value(forKey:)
.Swift 3: un plus performant approche pour le cas particulier de bijective dictionnaires
Si l'inverse recherche dans le dictionnaire de cas d'utilisation couvre une bijective dictionnaire avec une relation entre les clés et les valeurs, une approche alternative à la collecte exhaustive
filter
opération à l'aide d'un rapide de court-circuit pour trouver certains clé, si elle existe.Exemple d'utilisation:
Voici une autre approche, que j'ai écrit à propos de sur mon blog. Il a été testé contre les Swift 2.2.
C'est le plus efficace de mise en œuvre posté sur ce thread qui donne toutes les clés mappé à une valeur spécifiée, car elle utilise
flatMap
, au lieu defilter
et puismap
. J'ai écrit à propos deflatMap
dans mon Fonctions d'ordre supérieur dans Swift article, si vous êtes intéressé.Aussi, parce que ma méthode est générique (par le fait d'être dans le
Dictionary<Key,Value>
classe générique) vous n'avez pas besoin de jeter son résultat à la clé, type, ce qui est nécessaire lors de l'utilisation deallKeysForObject(_:)
deNSDictionary
.b
fournit une carte avecsearchingValue
qui est["key4":8,"key3":8]
b.keys.first
fournit un premier élément de l'ensemble filtré touches qui estg
a
est requis clé pour la valeur8
La Swift 2 version:
$0.1
et$0.0
au lieu de$0
et$1
s'il vous plaît?key
etvalue
sont dictionnaire éléments, non? Parce quedictionary = [key:valule]
.$0
est le premier élément dans le dictionnaire? Comme[firstKey:firstValue]
?Si vous avez besoin de trouver certains clé pour une valeur (c'est à dire pas tous d'entre eux si il n'y a plus d'un, mais juste tout arbitraire):
Ci-dessus renvoie
nil
si ce n'est pas la clé pour une valeur.Swift 5 sans extension
Pour quelque raison que ce soit ce genre de questions toujours d'obtenir des réponses qui utilisent
extension
. Si vous avez besoin de la clé pour une valeur spécifique à partir d'un seul dictionnaire ou une seule fois et ne veulent pas (et ne doivent) étendre la totalité d'un objet de la Fondation pour un cas, le faire manuellement:Cela fonctionne dans le cas où vous avez besoin d'une clé pour une valeur spécifique. Dans mon cas, a été l'approche la plus facile. Espérons que cela aide:
Swift 4.1+