Быстрое программирование ошибки NSErrorPointer и т.д.
var data: NSDictionary =
NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: error) as NSDictionary;
Эта строка кода дает мне ошибку
NSError is not convertable to NSErrorPointer.
Итак, я подумал изменить код на:
var data: NSDictionary =
NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: &error) as NSDictionary;
который превратил ошибку NSError в NSErrorPointer. Но затем я получаю новую ошибку и не могу ее понять:
NSError! is not a subtype of '@|value ST4'
Ответы
Ответ 1
Ваш NSError должен быть определен как Optional
, потому что он может быть nil:
var error: NSError?
Вы также хотите учесть наличие ошибки в разборе, которая вернет nil
или синтаксический анализ, возвращающий массив. Для этого мы можем использовать опциональное литье с оператором as?
.
Это оставляет нам полный код:
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
}
Ответ 2
Как уже упоминалось, ошибка должна быть определена как необязательная (https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/AdoptingCocoaDesignPatterns.html)
Однако - этот код БУДЕТ ЗАПРЕЩАЕТСЯ, если возникла ошибка, и nil возвращается, "As NSDictionary" будет виновником:
var data: NSDictionary =
NSJSONSerialization.JSONObjectWithData(responseData, options:NSJSONReadingOptions.AllowFragments, error: &error) as NSDictionary;
Вам нужно выполнить синтаксический анализ json следующим образом:
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)")
}
Это сработает. Также помните, что json может возвращаться как массив. Вместо того, чтобы передавать ноль для параметров, вы можете передавать все, что вам нравится, например:
NSJSONReadingOptions.AllowFragments
если хотите.
Ответ 3
Теперь в бета-3
var error: AutoreleasingUnsafePointer<NSError?> = nil
var data: NSDictionary = NSJSONSerialization.JSONObjectWithData( w, options:.AllowFragments, error: error ) as NSDictionary;
Ответ 4
Проверить С помощью кода ниже:
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)")
Попробуйте использовать
var error: AutoreleasingUnsafePointer<NSErrorPointer?>=nil