2015-04-07 25 views
6

Próbuję przekonwertować [String : String] (SWIFT Dictionary) do NSDictionary, do późniejszego wykorzystania w bibliotece JSON, który wytwarza ciągJak przekonwertować szybkiego Dictionary do NSDictionary

var parcelDict = ["trackingNumber" : parcel.number, 
        "dstCountry" : parcel.countryCode]; 

if (parcel.postalService != nil) 
{ 
    parcelDict["postalService"] = parcel.postalService; 
} 

var errorPtr: NSErrorPointer 
let dict: NSDictionary = parcelDict 
var data = NSJSONSerialization.dataWithJSONObject(dict, options:0, error: errorPtr) as NSData 

return NSString(data: data, encoding: NSUTF8StringEncoding) 

ale let dict: NSDictionary = parcelDict nie działa

let dict: NSDictionary = parcelDict as NSDictionary 

var data = NSJSONSerialization.dataWithJSONObject(parcelDict as NSMutableDictionary, options:0, error: errorPtr) as NSData 

Wszystkie te przykłady nie działają. Wytwarzają one następujące błędy:

enter image description here

enter image description here

Co to jest poprawny sposób to zrobić?

Aktualizacja:

kod, który działa

var parcelDict = ["trackingNumber" : parcel.number!, 
        "dstCountry" : parcel.countryCode!]; 

if (parcel.postalService != nil) { 
    parcelDict["postalService"] = parcel.postalService; 
} 

var jsonError : NSError? 
let dict = parcelDict as NSDictionary 
var data = NSJSONSerialization.dataWithJSONObject(dict, options:nil, error: &jsonError) 
return NSString(data: data!, encoding: NSUTF8StringEncoding)! 

Odpowiedz

9

Musisz rzucać go tak:

let dict = parcelDict as NSDictionary 

Inaczej Swift słownik i NSDictionary traktowane są niemal ten sam sposób, gdy używając go w metodach np:

func test(dict: NSDictionary) {} 

let dict = ["Test":1] 
test(dict) 

Działa zupełnie bez zarzutu.


Po aktualizacji

Jeśli zmienisz słownik typ wartości do nieprzestrzegania opcjonalnym String wówczas błąd odejdzie.

[String:String?] change to -> [String:String] 
+0

Twój słownik nie jest [String: String] a [String: String?] – Arbitur

+0

Nie ma potrzeby posiadania opcjonalnej wartości w słowniku, chyba że nadal chcesz mieć klucz, który nie ma nic wspólnego . – Arbitur

+0

Moja sugestia jest po prostu zmienić wartość na ciąg zamiast ciągu? – Arbitur

0

Nie trzeba konwertować go na NSDictionary. Wystarczy użyć:

var data = NSJSONSerialization.dataWithJSONObject(parcelDict, options:0, error: errorPtr) as NSData 

To wymienione w tym poście: Making a JSON object in Swift

Edit

ze swojego screeny wierzę, problem leży w rodzaju wartości w Słowniku parcelDict. mogę odtworzyć ten błąd z następującego kodu:

let dict = [String: String?]() 
let nsDict = dict as NSDictionary // [String: String?] is not convertible to NSDictionary 

Jednak stosując String zamiast String? jako typ wartość usuwa błąd.

Dlatego, jeśli zapełnisz parcelDict, powinieneś tylko dodać do niego wartości, które nie są nil.

1

Można użyć Ta łatwa metoda

let dictSwift = ["key1": "value1", "key1": value2] 

let dictNSMutable = NSMutableDictionary(dictionary: dictSwift) 

Ciesz kodowania!