Swift w wersji beta 5 dodał tę funkcję, a przybrałeś nową metodę w kilku próbach. Operatory rozpakowywania !
i ?
przechodzą obecnie przez tę wartość do operatorów lub wywołań metod. To znaczy, można dodać do tej tablicy w jeden z następujących sposobów:
dict["key"]! += [4]
dict["key"]!.append(4)
dict["key"]?.append(4)
Jak zawsze, należy uważać, o których operator użyć - życie rozpakowaniu wartość, która nie ma w swoim słowniku dadzą ci runtime error:
dict["no-key"]! += [5] // CRASH!
Zważywszy użyciu opcjonalnego łańcuchowym zawiedzie cicho:
dict["no-key"]?.append(5) // Did it work? Swift won't tell you...
Idealnie byłbyś w stanie korzystać z nowego operatora zerowy koalescencyjny ??
rozwiązać ten drugi przypadku, ale teraz to nie działa.
Odpowiedź z pre-beta Swift 5:
Jest to dziwactwo Swift, że nie jest możliwe, aby zrobić to, co próbujesz zrobić. Problem polega na tym, że wartość dowolnej zmiennej Opcjonalnej jest w rzeczywistości stałą - nawet podczas wymuszania rozpakowywania. Jeśli po prostu zdefiniować opcjonalnego tablicę, oto co możemy, a czego nie może zrobić:
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
Powodem masz problemy ze słownika jest to, że indeksowanie słownika zwraca wartość opcjonalna, ponieważ nie ma gwarancji, że słownik będzie miał ten klucz. Dlatego tablicą w słowniku ma takie samo zachowanie jak opcjonalna tablicy powyżej:
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
Jeśli trzeba zmienić coś w tablicy w słowniku trzeba uzyskać kopię tablicy, zmiany Opisz i przypisanie, tak:
if var arr = dict["key"] {
arr.append(4)
dict["key"] = arr
}
ETA: sama technika działa w Swift beta 3, chociaż stałe tablice nie pozwalają już zmian w treści.
Gdyby nie 'dict [ "klucz"] !. dołączania (4)' pracę wtedy? –
Nie - subskrybowanie słownika przywraca Opcjonalnie, więc w pierwszym przykładzie pracujesz z opcjonalną tablicą. –
Nie wiem, dlaczego Apple nie zdefiniował operatora + dla tablic. Jeśli zrobisz to sam, możesz użyć dict ["key"] = dict ["key"]! + 4. – Jessy