2015-02-08 8 views
5

Ich habeein [String: ANYOBJECT] zuweisen [String: ANYOBJECT] in Swift ersetzt

mit Semikolon Komma
var params = [String:AnyObject]() 

Ich habe eine Funktion, die ein [String:AnyObject] zurückgibt. Also, ich möchte, dass von params so zu einem Schlüssel zuweisen:

params["phoneDetails"] = getPhoneDetails() 

Das Problem I bin vor, die Rückkehr von getPhoneDetails() unterscheidet sich von dem Wert in params["phoneDetails"]. Hier

ist die Ausgabe von getPhoneDetails()

[locale: en, ostype: 32bit, appversion: 4.0.0, architecture: x86, version: 8.1] 

Hier ist die Ausgabe von params["phoneDetails"]:

Optional({ 
    appversion = "4.0.0"; 
    architecture = "x86 "; 
    locale = en; 
    ostype = 32bit; 
    version = "8.1"; 
}) 

Anstatt also ein Komma, ich sehe ein Semikolon, wenn println(params["phoneDetails"]) mit .

Ich möchte, dass es gleich dem Rückgabetyp von getPhoneDetails ist. Was mache ich falsch?

+0

Die Ausgabe für println Formatierung seine eigenen Regeln folgt. Wenn Sie eine andere Formatierung wünschen, müssen Sie dies manuell tun. –

+0

Meine Annahme wäre, dass getPhoneDetails() ein Tupel und kein Dictionary zurückgibt. Woher kommt getPhoneDetails()? – Alex

+0

Ich schrieb es. Es gibt eine [String: AnyObject] zurück. – Rishi

Antwort

6

Der Grund dafür ist, dass Swift implizit Umwandeln Ihrer Swift.Dictionary in ein NSDictionary:

let d: [String:AnyObject] = ["one":"1","two":"2"] 
// Swift.Dictionary implements Printable.description 
// (which println uses) as [key:value, key:value] 
d.description 

let nsd = d as NSDictionary 
// NSDictionary on the other hand, implements 
// it as {\n key = value;\n key = value;\n} 
nsd.description 

Der Grund für diese Umwandlung ist die Nutzung von AnyObject. Theoretisch kann AnyObject nur Referenztypen (d. H. Klassen) speichern. Versuchen Sie, die folgenden auf einem Spielplatz ohne Import-Anweisungen oben d entfernen import UIKit oder was auch immer:

// this won’t even compile - Strings aren’t classes, they’re structs 
// so you can’t assign them to AnyObject 
let d: [String:AnyObject] = ["one":"1","two":"2"] 

// this fixes that: 
let e: [String:String] = ["one":"1","two":"2"] 
// but this won’t compile: 
let o: AnyObject = e // [String:String] doesn’t conform to protocol AnyObject 

Aber import Foundation und plötzlich Magie passiert. Zwei Bits der Magie in der Tat: String-Literale können jetzt NSString Objekte erstellen, die Klassen sind und somit AnyObject entsprechen. Und Swift-Wörterbücher können leise in NSDictionary Objekte konvertiert werden, die ebenfalls Klassen sind, die AnyObject entsprechen. Letzteres ist das, was dir passiert, und so bekommst du eine andere Ausgabe, weil dein Typ tatsächlich von einem anderen Typ ist.

Wenn Sie nicht wollen, von verschiedenen Typen sein, haben Sie zwei Möglichkeiten - Rückkehr ein NSDictionary von Ihrer getPhoneDetails Funktion (ick) oder stoppten AnyObject verwenden und stattdessen Ihr Wörterbuch deklarieren vom Typ [String:[String:String]] (yay sein, aber Dies führt zu stärkeren Typen und Werten anstelle von Referenzsemantiken, was bedeuten kann, dass andere Codes umgestaltet werden müssen.

(oder ich denke, Sie zu [String:Any] wechseln könnte, aber es liegt Wahnsinn)

Verwandte Themen