2015-01-18 10 views
13

Ich habe ähnliche Fragen durchgemacht, aber immer noch nicht verstehen, warum mein Code einen Fehler wirft.(String: AnyObject) hat kein Mitglied mit dem Namen 'tiefgestellt'

var dict = [String:AnyObject]() 
dict["participants"] = ["foo", "bar"] 
dict["participants"][0] = "baz" 

Der Fehler ist in Zeile 3: (String: AnyObject) does not have a member named 'subscript'

Ich gründe die participants Schlüssel zu einem Array und dann versuchen, das erste Element der es ohne Glück zu aktualisieren. Der obige Code ist zu Beispielzwecken verkürzt, aber ich verwende [String:AnyObject], weil nicht nur Arrays im Wörterbuch gespeichert sind.

Es ist wahrscheinlich etwas wirklich trivial, aber ich bin zu Swift noch neu. Danke für jede Hilfe im Voraus!

Antwort

19

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 
}() 
+0

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

+0

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

+0

@Fenda Perfekt zumutbar; das passiert die ganze Zeit. Aber dann musst du casten. Ich habe meine Antwort aktualisiert, um zu demonstrieren. – matt

Verwandte Themen