web-dev-qa-db-ja.com

swift 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'
42
user3732493

これらのタイプとメソッドは、Swift 1。

  1. NSプレフィックスは削除されます
  2. メソッドはエラーポインターを取得する代わりに例外をスローするようになりました
  3. NSDictionaryの使用は推奨されません。代わりにSwift辞書を使用してください

これにより、次のコードが生成されます。

do {
    let object = try JSONSerialization.jsonObject(
        with: responseData,
        options: .allowFragments)
    if let dictionary = object as? [String:Any] {
        // do something with the dictionary
    }
    else {
        print("Response data is not a dictionary")
    }
}
catch {
    print("Error parsing response data: \(error)")
}

特定の解析エラーを気にしない場合:

let object = try JSONSerialization.jsonObject(
    with: responseData,
    options: .allowFragments)
if let dictionary = object as? [String:Any] {
    // do something with the dictionary
}
else {
    print("Response data is not a dictionary")
}

元の回答

NSErrorは、nilになる可能性があるため、Optionalとして定義する必要があります。

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
}
68
drewag

前述したように、エラーはオプションとして定義する必要があります( 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が配列として返されることもあります。オプションにnilを渡す代わりに、次のように好きなものを渡すことができます。

NSJSONReadingOptions.AllowFragments

もし良かったら。

11
user1687195

現在ベータ3

var error: AutoreleasingUnsafePointer<NSError?> = nil

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

以下のコードで確認:

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
0
PREMKUMAR