Webapiにて生じた問題 その2 


errorの生じない解決されたコード

```
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()
}
```

以下が学習記録




```
実際に書いたコード

import UIKit


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //画面がでたら、最初に実行されるメソッド
        //selfは現在のオブジェクトを表す => ViewControllerに属しているメソッドであることを明示している
        self.showSongs()
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    private func showSongs() {
        
        //リクエストを送信する機能の実装
        
        //URLにurlStrigという名前をつけてあげる。
        //let定数 urlStringに取得したい情報が格納されているアドレスを代入する
        let urlString = "https://itunes.apple.com/search?term=Ryuichi+Sakamoto&entity=musicTrack&limit=3&lang=ja_jp&country=JP"
        //定数urlStringに格納されている情報をNSURL型のオブジェクトに代入する必要がある。
        //なぜなら、URLの専用の情報を扱うオブジェクトに手に入れた情報を代入したい
        //そうすることでNSURLに変換されたURLの情報を取得したことになる。
        let url = NSURL(string: urlString)
        //NSURLSession WEbAPIから情報をとってくるメソッドをもつクラス
        //configuration 設定内容
        let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
        //リクエストを送信し、返されたデータを取得する
        //urlの!はオプショナルという機能 空の情報が与えられるとエラーを返す。
        //urlの?は空の情報が返されても、エラーを返さない。
        let dateTask = session.dataTaskWithURL(url!, completionHandler: { (date, response,
            error) -> Void in
            if (error == nil) {
                let json =
                    NSJSONSerialization.JSONObjectWithData(data,
                        options: NSJSONReadingOptions.AllowFragments, erorr: nil) as! [[String:AnyObject]]
                let results = json["results"] as![[String:AnyObject]]
                for song in results {
                    let trackName = song["trackName"] as! String println(trackName)
                }
                
            }
        })
        dateTask.resume()
        
    }
    
}




```


##より詳細にした場合


```
取ってきたい情報のあるURLに定数名urlStringをつける

let urlString = "https://itunes.apple.com/search?term=Ryuichi+Sakamoto&entity=musicTrack&limit=3&lang=ja_jp&country=JP"
```

```
Web APIから情報を取ってくるために、NSURL型のクラスに変換している => URL専用の情報を扱う、アクセスする為のクラスに変換している。そのオブジェクトに定数名urlをつけている
let url = NSURL(string: urlString)

```

```
今後の流れ、文字列を対応するクラスに変換し、そこから取得したデータをJSONに変換し、そのデータをXcode上に出力する
String(文字列) => NSURL型(URL専用)に変換する必要がある => さらに取得したデータをJSONとして解釈し、変換する => 抽出したデータをXcodeのコンソール上に出力

String(URL) => NSURL型 => JSON型 => Xcode上で出力
```


```
NSURLSession(クラス)

WebAPIから情報を取ってくるメソッドを持っているクラス
そのクラスに属するオブジェクトに定数名sessionをつける

let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
```


##ここがよく分からない

```

ここでは、リクエストを送信して、返却されたデータを取得している

dataTaskWithURLとは
仮定 WebAPIと通信タスクを生成するメソッドを持つクラス
completionHandler: { (data, response, error) -> Void inとは
仮定 ここで通信タスクを生成している

let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as! [String: AnyObject]
NSdata型のデータをJSONとして解釈し、プログラムで扱える個別のオブジェクトに変換

let results = json["results"] as! [[String:AnyObject]]
定数resultsに定数jsonのデータを入れて,配列として返す
[[String:AnyObject]]に曲名やタイトルが曲数分入っている

for song in results {
                    let trackName = song["trackName"] as! String
                    print(trackName)
                }
                
results(配列)からsongごとに、一曲ずつ取り出す。               

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

もしもdataの中にerrorがなければ処理を開始する
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()
    // 通信タスクを開始する

```