2014-06-12 9 views
42
var data: NSDictionary = 
    NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: error) as NSDictionary; 

Diese Codezeile mirschnellen Programmierung NSErrorPointer Fehler etc

NSError is not convertable to NSErrorPointer. 

Fehler gibt also dann, um den Code zu dachte ich zu ändern:

var data: NSDictionary = 
    NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: &error) as NSDictionary; 

die den NSError Fehler in eine Kurve würde NSErrorPointer. Aber dann bekomme ich einen neuen Fehler und kann nicht Sinn geben:

NSError! is not a subtype of '@|value ST4' 

Antwort

68

Ihre NSError muss als Optional definiert werden, da es sein kann, nil:

var error: NSError? 

Sie auch dort berücksichtigen wollen ist ein Fehler in der Analyse, die nil oder die Analyse zurückgibt, die ein Array zurückgibt. Um dies zu erreichen, können wir ein optionales Casting mit dem Operator as? verwenden.

Das führt uns mit dem kompletten Code lässt:

var possibleData = NSJSONSerialization.JSONObjectWithData(
    responseData, 
    options:NSJSONReadingOptions.AllowFragments, 
    error: &error 
    ) as? NSDictionary; 

if let actualError = error { 
    println("An Error Occurred: \(actualError)") 
} 
else if let data = possibleData { 
    // do something with the returned data 
} 
+3

Dies stürzt ab, wenn ein Fehler auftritt Parsen der json und Null zurückgeführt wird. Siehe diese Antwort: http://stackoverflow.com/a/24333999/1687195 – user1687195

+0

Ich aktualisierte die Antwort, um Abstürze von einem Parsing Fehler zu vermeiden – drewag

0

prüfen Mit folgenden Code:

var error: AutoreleasingUnsafePointer<NSErrorPointer?>=nil 
var dataVal: NSData = NSURLConnection.sendSynchronousRequest(request1, returningResponse: response, error:nil) 
var err: NSError? 
var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary 
    println("Result\(jsonResult)") 

Versuchen

mit
var error: AutoreleasingUnsafePointer<NSErrorPointer?>=nil 
11

Wie bereits erwähnt, muss der Fehler als optional definiert werden (https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/AdoptingCocoaDesignPatterns.html)

jedoch - Dieser Code stürzt ab, wenn ein Fehler aufgetreten ist und Null zurückgeführt wird, die „Als NSDictionary“ die Ursache sein würde:

var data: NSDictionary = 
NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: &error) as NSDictionary; 

Sie müssen die json wie diese Parsen tun:

var jsonError : NSError? 

let jsonResult : AnyObject? = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &jsonError) 

if let error = jsonError{ 
    println("error occurred: \(error.localizedDescription)") 
} 
else if let jsonDict = jsonResult as? NSDictionary{ 
    println("json is dictionary \(jsonDict)") 
} 
else if let jsonArray = jsonResult as? NSArray{ 
    println("json is an array: \(jsonArray)") 
} 

Das wird funktionieren. Denken Sie auch daran, dass JSON als Array zurückkommen kann. Anstatt Null für die Optionen zu übergeben, die Sie übergeben können, wie Sie möchten, zum Beispiel:

wenn Sie möchten.

1

jetzt in der Beta-3

var error: AutoreleasingUnsafePointer<NSError?> = nil 

var data: NSDictionary = NSJSONSerialization.JSONObjectWithData(w, options:.AllowFragments, error: error) as NSDictionary; 
+0

Oder 'var error: NSErrorPointer? = nil' für kurze – Snowman

+0

Danke moby, '?' ist unnötig. So, Var Fehler: NSErrorPointer = Null – Satachito

Verwandte Themen