1

Xcode 7 でコンパイルする次のコードを取得できないようです。「タイプの引数リストで 'dataTaskWithURL' を呼び出すことができません」というエラーが表示されます。

completionHandler はオプションではなくなったようです。次のコードを書き直す方法がわかりません。助けていただければ幸いです、ありがとう

    let session = NSURLSession.sharedSession()
    let url = NSURL(string: urlString)

    var task = session.dataTaskWithURL(url!) {
        (data, response, error) -> Void in

        if error != nil {
            print(error!.localizedDescription)
        }
        else {
            var error: NSError?

            var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
            // Do Stuff
        }
    }

    task!.resume()
4

3 に答える 3

9

コンパイラは次のエラーをスローしています。

/Users/Xcode/Desktop/fdsfsdfds/fdsfsdfds/AppDelegate.swift:24:28: タイプ「(NSURL, (_, _, _) throws -> Void)」の引数リストで「dataTaskWithURL」を呼び出すことはできません

completionHandlerでは、JSONObjectWithData 最終的にスローされる可能性のある例外をキャッチしていません。したがって、コンパイラは、completedHandler に次の署名が必要な例外を伝播しようとしていると推測します。

(NSData?, NSURLResponse?, NSError?) throws -> Void

これは実際のcompletionHandler dataTaskWithURLが期待しているものと一致しないため、エラーが発生します。

この問題を解決するには、次のようにNSJSONSerialization.JSONObjectWithDatais への呼び出しを do/catch ステートメントでラップして、エラーを処理します。

do {
    var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
    // Do Stuff

} catch {
    // handle error
}

Swift2 でのエラー処理の詳細については、こちらから入手できるプレリリース ドキュメントを参照してください。

于 2015-06-16T11:04:59.790 に答える
2

Swift 2.0 (Xcode 7 beta 6) 以降では、dataTaskWithURL()次のように使用します。

var task = session.dataTaskWithURL(url!, completionHandler: {
   (data, response, error) -> Void in

   :
})
task.resume()

NSJSONSerialization.JSONObjectWithData完了ハンドラー内で使用するには、catch エラーも必要です。

    do {
        var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
        // Do Stuff
    } catch {
        // handle error
    }
于 2015-09-02T12:19:50.390 に答える
1
let url : String = String(format: "http://api.nytimes.com/svc/news/v3/content/nyt/all/720.json?api-key=%@",apiKey)
        let url1: NSURL = NSURL(string: url)!
      let session = NSURLSession.sharedSession()
        let task1 = session.dataTaskWithURL(url1, completionHandler: {
            (data, response, error) -> Void in
                        do {
                         if data == nil {
                    return
                }
                else
                {

                let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary
                self.dict = jsonData;
                self.array1 = (self.dict.objectForKey("results") as? NSMutableArray)!
                dispatch_async(dispatch_get_main_queue()) {
                    self.table.reloadData()
                }

                }

            } catch {

            }

        })
于 2015-10-20T05:18:24.500 に答える