2015-09-21 12 views
7

ein Wörterbuch haben wie folgt definiert:Swift Wörterbuch Get Key für Werte

let drinks = [String:[String]]() 

drinks = ["Soft Drinks": ["Cocoa-Cola", "Mountain Dew", "Sprite"], 
"Juice" :["Orange", "Apple", "Grape"]] 

Wie kann ich den Schlüssel für einen bestimmten Wert zu bekommen.

let key = (drinks as NSDictionary).allKeysForObject("Orange") as! String 
print(key) 
//Returns an empty Array. Should return "Juice" 

Antwort

15
func findKeyForValue(value: String, dictionary: [String: [String]]) ->String? 
{ 
    for (key, array) in dictionary 
    { 
     if (array.contains(value)) 
     { 
      return key 
     } 
    } 

    return nil 
} 

Rufen Sie die obige Funktion denen einen optionalen String zurückgeben?

let drinks = ["Soft Drinks": ["Cocoa-Cola", "Mountain Dew", "Sprite"], 
     "Juice" :["Orange", "Apple", "Grape"]] 

print(self.findKeyForValue("Orange", dictionary: drinks)) 

Diese Funktion gibt nur den ersten Schlüssel des Arrays zurück, für den der Wert übergeben wurde.

+0

mein Problem gelöst. Vielen Dank. – Statik

+1

Gibt nur den ersten Schlüssel zurück, auch wenn mehrere vorhanden sind. – zaph

+0

func findKeysForValue (value: String, Wörterbuch: [String: [String]]) -> [String] { var Schlüssel = [Zeichenfolge]() für (Schlüssel, Array) im Wörterbuch { if (Array. enthält (Wert)) { keys.append (key) } } return Schlüssel } – abintom

2

Aufzählen durch alle Wörterbucheinträge und testen Sie jede Werteliste für den gewünschten Wert und die Schlüssel akkumulieren, wenn der Wert vorhanden ist.

Beispiel, findet alle Getränke, die den gewünschten Wert in einer Liste enthalten:

let drinks = [ 
    "Soft Drinks": ["Orange", "Cocoa-Cola", "Mountain Dew", "Sprite"], 
    "Juice" :["Apple", "Grape"] 
] 

let value = "Orange" 

var keys = [String]() 
for (key, list) in drinks { 
    if (list.contains(value)) { 
     keys.append(key) 
    } 
} 

print("keys: \(keys)") 

Schlüssel: [ "Soft Drinks"]

8

In Swift 2.0 können Sie das Wörterbuch filtern und dann das Ergebnis einem Array zuordnen.

let keys = drinks.filter { 
    return $0.1.contains("Orange") 
}.map { 
    return $0.0 
} 

Das Ergebnis wird ein Array von String Objekt sein, die passenden Schlüssel darstellt.

+1

Works, returns gibt alle Schlüssel zurück, die übereinstimmende Werte haben, aber kryptisch. – zaph

+0

"Cryptic" ist ein hartes Wort, wenn man bedenkt, dass Filter und Karte Funktionen höherer Ordnung sind. Die Syntax ist heutzutage veraltet, aber das ist ungefähr –

-2

versuchen, diese (swift):

(dic as NSDictionary).allKeysForObject(<#T##anObject: AnyObject##AnyObject#>) 

es Arbeit für mich

+0

(trinkt als NSDictionary) .allKeysForObject ("Orange") gibt ein leeres Array zurück, nicht "Juice" wie angefordert. übrigens ist es in der Frage geschrieben. Bitte überprüfen Sie Ihre Antwort auf einem Spielplatz oder auf andere Weise, bevor Sie sie veröffentlichen. – user3441734

+0

relax mann. Ich schreibe einfach eine generische Vorlage, um anderen eine ähnliche Frage zu stellen. Ich schreibe keinen Parameter. Sie lesen zu viel in meine Antwort –