Swift Beta 5 hat diese Funktionalität hinzugefügt, und Sie haben die neue Methode in ein paar Ihrer Versuche genagelt. Die Unwrapping-Operatoren !
und ?
übergeben den Wert nun an Operatoren oder Methodenaufrufe. Das heißt, Sie zu diesem Array in eine der folgenden Arten hinzufügen:
dict["key"]! += [4]
dict["key"]!.append(4)
dict["key"]?.append(4)
Wie immer vorsichtig sein, welchen Operator Sie verwenden - force Wert auspackt, die nicht in Ihrem Wörterbuch ist wird Ihnen ein Laufzeitfehler:
dict["no-key"]! += [5] // CRASH!
Während optional Verkettung mit lautlos fehl:
dict["no-key"]?.append(5) // Did it work? Swift won't tell you...
Im Idealfall würde Sie in der Lage sein, den neuen Null Koaleszierstruktur Operator verwendet ??
diese zweite Adresse Fall, aber im Moment funktioniert das nicht.
Antwort von Pre-Swift Beta 5:
Es ist eine Marotte von Swift, dass es nicht möglich ist, zu tun, was Sie zu tun versuchen. Das Problem ist, dass der Wert einer optionalen Variable in der Tat eine Konstante ist - auch wenn er zwangsweise auspacken. Wenn wir nur ein optionales Array definieren, hier ist das, was wir können und nicht tun können:
var arr: Array<Int>? = [1, 2, 3]
arr[0] = 5
// doesn't work: you can't subscript an optional variable
arr![0] = 5
// doesn't work: constant arrays don't allow changing contents
arr += 4
// doesn't work: you can't append to an optional variable
arr! += 4
arr!.append(4)
// these don't work: constant arrays can't have their length changed
Der Grund sind Probleme mit dem Wörterbuch ist, dass ein Wörterbuch Indizierung eines optionalen Wert zurückgibt, da es keine Garantie gibt, dass Das Wörterbuch wird diesen Schlüssel haben. Daher hat ein Array in einem Wörterbuch das gleiche Verhalten wie das Fakultativ Array vor:
var dict = Dictionary<String, Array<Int>>()
dict["key"] = [1, 2, 3]
dict["key"][0] = 5 // doesn't work
dict["key"]![0] = 5 // doesn't work
dict["key"] += 4 // uh uh
dict["key"]! += 4 // still no
dict["key"]!.append(4) // nope
Wenn Sie etwas in einem Array im Wörterbuch ändern benötigen Sie eine Kopie des Arrays, ändern erhalten müssen es und neu zuzuweisen, wie folgt aus:
if var arr = dict["key"] {
arr.append(4)
dict["key"] = arr
}
ETA: Der gleiche Technik funktioniert in Swift beta 3, obwohl konstante Arrays nicht mehr Änderungen an Inhalten ermöglichen.
Sollte nicht 'dict [ "key"] !. anhängen (4)' Arbeit dann? –
Nein - Subskribierung eines Wörterbuchs gibt Ihnen ein Optional zurück, so dass Sie mit dem optionalen Array in meinem ersten Beispiel arbeiten. –
Ich weiß nicht, warum Apple den Operator + für Arrays nicht definiert hat. Wenn Sie es selbst tun, können Sie dict ["key"] = dict ["key"] verwenden! + 4. – Jessy