17729


下記のコードでエラーが生じ,解決策が思いつかないため、お知恵をお借りできればと思います。  
よろしくお願い申し上げます。

NSJSONSerialization.JSONObjectWithDataの部分でbuildエラーが生じるため、下記のそのエラーを修正するコードを書きましたが、うまくいきませんでした。

解決したいこと

定数 jsonの行で生じるエラーを改善したい。

[code]

    問題のあるコード
    
      private func showSongs() {
        let urlString = "https://itunes.apple.com/search?term=Ryuichi+Sakamoto&entity=musicTrack&limit=3&lang=ja_jp&country=JP"
        let url = NSURL(string: urlString)
        let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
        let dataTask = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
            if (error == nil){
            //ここから
                let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: nil) as! [String:AnyObject]
            //ここまでがExtra argument 'error' in call、つまりエラーになります。
                let results = json["results"] as! [[String:AnyObject]]
                for song in results {
                    let trackName = song["trackName"] as! String
                    println(trackName)
                }
            }
        })
        dataTask.resume()
    }
    
[/code]

  
  
ネットで解決策を探し、書いてみたコード(より多くのエラーが生じました。)

[code]

    private func showSongs(){
        let urlString = "https://itunes.apple.com/search?term=Ryuichi+Sakamoto&entity=musicTrack&limit=3&lang=ja_jp&country=JP"
        let url = NSURL(string: urlString)
        let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
        let dataTask = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
            do{
                let json =  NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as! [String:AnyObject]
                let results = json["results"] as! [String:anyObjects]
                for song in results {
                    let trackName = song["trackName"] as! String
                    print(trackName)
                }
        }
    })
    dataTask.resume()
    
[/code]

}


CC BY-SA 3.0
2015-10-16T11:26:55.823
17727
2015-10-16T11:44:26.713
10491
question
swift
swiftにて、extra argument 'error' in callのエラーを改善したい。


Swift
2では新しいエラーハンドリングの仕組みとして`do〜try〜catch`構文が導入され、`NSError`のダブルポインタはSwiftから使う場合は自動的に上記のAPIに沿うように変換されるようになりました。

なのでメソッドの定義から`NSError`の引数はなくなっているにもかかわらず、以前と同じ形式で呼び出しているので引数が多いというコンパイルエラーになっています。

該当の部分を`do〜try〜catch`を使って書き直すと、下記のようになります。

[code]

    do {
        let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as! [String: AnyObject]
        ...
    } catch let error as NSError {
        // エラー処理をする
    }
    
[/code]

バリエーションとして、エラーを単に無視する`try?`や、エラーがあった時にクラッシュする、`try!`という書き方があります。`try?`あるいは`try!`を使うと`do~catch`ブロックは不要になります。

詳しくは  
<https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html>

^ こちらをご覧ください。

他にもいくつかSwift 2ではエラーになる箇所がありましたので、全部修正したのは下記になります。

[code]

    private func showSongs() {
        let urlString = "https://itunes.apple.com/search?term=Ryuichi+Sakamoto&entity=musicTrack&limit=3&lang=ja_jp&country=JP"
        let url = NSURL(string: urlString)
        let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
        let dataTask = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
            if let data = data where error == nil {
                do {
                    let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as! [String: AnyObject]
                    let results = json["results"] as! [[String:AnyObject]]
                    for song in results {
                        let trackName = song["trackName"] as! String
                        print(trackName)
                    }
                } catch let error as NSError {
                    // エラー処理をする
                }
            }
        })
        dataTask.resume()
    }
    
[/code]


CC BY-SA 3.0
2015-10-16T11:44:26.713
17729
2015-10-16T11:44:26.713
5519
17727
answer