2017-01-15 3 views
0

Ok Hinzufügen, sagen, ich habe ein Wörterbuch:mehrere Definitionen für einen einzelnen Schlüssel

someDict["Smiling"] = ":)

Aber lassen Sie uns sagen:

var someDict = [String: String]()

ich einen Schlüssel und Definition, um es mit hinzufügen Ich möchte "Smiling" eine andere Definition hinzufügen, z. B. :D.

someDict["Smiling"]? += ":D"

print(someDict) 
["Smiling": ":):D"] 

Jetzt möchte ich ist

["Smiling": ":)", ":D"]. Ich weiß, das wird nicht funktionieren, wegen der Seperator.

So brauche ich eine Möglichkeit, ["Smiling": [":)", ":D"]] zu verwenden, auf diese Weise könnte ich mit someDict["Smiling"][1] zugreifen, und das wäre gleich :D.

Ich werde nicht Liste will ich habe versucht, wie es alles nutzlos ist, und ich weiß nicht, was ich tue.

ist, will ich

Fazit der Lage sein, einen Schlüssel in einem Wörterbuch hinzuzufügen, for-Schleife in einem potenziell.

+0

Du hast Recht, müssen Sie '[Zeichenfolge: [String]]', und das wird funktionieren, aber Sie müssen uns sagen, was mit der Verwendung von 'someDict [" Smiling "] ?. zuerst", "someDict [" Smiling "] ?. last', etc ... – Grimxn

Antwort

1

Alles, was Sie benötigen, sollten diese Art von Datenformat:

var someDict = [String: [String]]() 

es initialisieren:

someDict["Smiling"] = [":)"] 

Auf diese Weise können Sie dies tun:

someDict["Smiling"]?.append(":D") 

es Und nennen:

someDict["Smiling"]?[1] //returns ":D" 

bearbeiten:

Wahrscheinlich lohnt zu erwähnen, dass als @dfri angegeben, die explizite Array-Index-Aufruf („[1]“) ist unsicher, da dies fehlschlagen, wenn Ihr Array nicht zwei oder mehr Werte. Eine "Swifty" -Lösung besteht darin, Ihren ungültigen Index zu validieren, indem überprüft wird, ob er sich im Array befindet.

Dies könnte etwa so aussehen (Danke für den Code @Hamish):

let idx = 1 

if let arr = someDict["Smiling"], arr.indices.contains(idx) { 
    print(arr[idx]) // :D 
} 
+1

Keine der beiden letzten Codezeile kompiliert wird. Der Zugriff auf einen Wörterbuchwert nach Schlüssel ergibt eine Option, so dass Sie diese vor der Mutation entpacken müssen (z.mit optionaler Bindung, someDict ["Smiling"]? append (": D") "&" someDict ["Smiling"]? [1] '). Beachten Sie, dass der letztgenannte explizite Zugriff durch den Index unsicher ist, da dies zu einer Laufzeitausnahmebedingung führen wird, wenn der Index außerhalb des zulässigen Bereichs liegt. – dfri

+0

@dfri Sorry übersehen, dass. Es ist jetzt behoben. –

+0

@dfri Für Ihren zweiten Punkt darüber, dass es unsicher ist, wie könnte ich das verbessern? Würde die Länge des Arrays vor dem Aufruf überprüft, wäre das eine gute Idee? –

0

Sie wirklich brauchen, dies in einer Struktur Ihrer eigenen einpacken. Genau wie Sie es tun auf die Semantik ab, die Sie wollen, aber als Ausgangspunkt etwas wie folgt betrachten:

struct MyDictArray { 
    private var _data: [String : [String]] = [:] 

    mutating func append(key: String, value: String) { 
     if let existingEntry = self._data[key] { 
      self._data[key] = existingEntry + [value] 
     } else { 
      self._data[key] = [value] 
     } 
    } 
    subscript(key: String) -> [String] { 
     get { 
      if let existingEntry = self._data[key] { 
       return existingEntry 
      } else { 
       return [] 
      } 
     } 
     set { 
      if let existingEntry = self._data[key] { 
       self._data[key] = existingEntry + newValue 
      } else { 
       self._data[key] = newValue 
      } 
     } 

    } 
    subscript(key: String, index: Int) -> String? { 
     if index < self[key].count { 
      return self[key][index] 
     } else { 
      return nil 
     } 
    } 
} 

var someDict = MyDictArray() 
someDict["Smiling"] = [":)"] 
someDict.append(key: "Smiling", value: "D") 
someDict["Smiling"] 
someDict["Smiling", 1] // Safe indexing 
Verwandte Themen