Die Fehlermeldung zeigt Ihnen genau, was das Problem ist. Ihre Wörterbuchwerte werden als AnyObject eingegeben. Ich weiß Sie wissen, dass dieser Wert ein String-Array ist, aber Swift weiß das nicht; es weiß nur, was du ihm gesagt hast, dass dies ein AnyObject ist. Aber AnyObject kann nicht subskribiert werden (tatsächlich kann man überhaupt nicht viel damit anfangen). Wenn Sie Subskriptionen verwenden möchten, müssen Sie Swift mitteilen, dass es sich hierbei nicht um ein AnyObject, sondern um ein Array irgendeiner Art (hier ein Array von String) handelt.
Es gibt dann ein zweites Problem, das ist, dass dict["participants"]
ist in der Tat nicht einmal ein AnyObject - es ist ein Optional Wrapping ein AnyObject. Also müssen Sie es auspacken und es umwandeln, um es zu subskribieren.
Es gibt dann ein drittes Problem, das darin besteht, dass Sie einen Array-Wert in einem vorhandenen Wörterbuch nicht mutieren können. Sie müssen den Wert extrahieren, mutieren und dann ersetzen.
Also, Ihre gesamte Code wird wie folgt aussehen:
var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
var arr = dict["participants"] as [String] // unwrap the optional and cast
arr[0] = "baz" // now we can subscript!
dict["participants"] = arr // but now we have to write back into the dict
extra für Experten: Wenn Sie disgustingly kühl und Swifty sein wollen (und wer nicht ??), können Sie die ausführen Mutation und die Zuordnung in einem Zug durch eine define-und-Call anonyme Funktion, wie dies mit:
var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
dict["participants"] = {
var arr = dict["participants"] as [String]
arr[0] = "baz"
return arr
}()
können Sie erklären, warum Sie 'dict' als' getippt [String: ANYOBJECT] 'in erster Linie? Ich sage nicht, dass es keinen Grund gibt, das zu tun, aber wenn jeder Wert auf eine Reihe von Strings geht, könnte man das auch im Voraus sagen. Andernfalls müssen Sie casten. – matt
Ja, Entschuldigung, ich hätte das deutlicher machen sollen. Der obige Code ist mehr zu Beispielzwecken, aber es wird nicht immer ein Array geben. In einigen Fällen wird es andere Datentypen haben. Ich werde die Frage aktualisieren. – Fenda
@Fenda Perfekt zumutbar; das passiert die ganze Zeit. Aber dann musst du casten. Ich habe meine Antwort aktualisiert, um zu demonstrieren. – matt