bitflyerから現在のbitcoinの価格を取得してみました。
var components = URLComponents("https://lightning.bitflyer.jp/ticker")
components?.queryItems = [URLQueryItem(name:"product_code",value:"BTC_JPY")]
let url = components?.url
let task = URLSession.shared.dataTask(with: url!){
data,response,error in
if let data = data, let response = response {
print(response)
do{
let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments)
print(json)
}catch{
print("Serivalize Error")
}
}else{
print(error ?? "Error")
}
}
task.resume()
- URLComponents
URLクエリストリングを付けてくれる構造体
components?.queryItems = [URLQueryItem(name:"product_code",value:"BTC_JPY")]
let url = components?.url
と
let url = URL(string:"https://lightning.bitflyer.jp/ticker?product_code=BTC_JPY")
は恐らく同じ意味。 queryItemsで追加できた方が取り回しし易いので便利
URLSession.shared.dataTask(with: url!)
- URLSession
- 通信タスクの管理クラス
- sharedはシングルトンのインスタンス取得. 普通はこっち、cookieとかの設定をしたい場合にはinitして生成するイメージ
- datataskはデータ取得のタスク
- dataTask(with:completionHandler:)の第二引数的に(with: url!){・・・}みたいに補完されるけど、これは何? (with: url!,completionHandler:{・・・})じゃないの? Trailing Closureという書き方らしい。最後の引数がクロージャだとこうやって書けるよ。と どうせ書く時は補完してくれるし、completionHandler:付けてたほうが見る人は理解し易いのでは?という気持ちがあるけど、脳が慣れれば自然になるのでしょう。 swiftって「label絶対つけろよ。わかりやすいだろ!」という感じかと思っていたのだけど、実際のところ_ がよく使われてたり、省略も増える傾向になっている気がする。
JSONSerialization.jsonObject
JSONからArrayとかDictionaryに変換する
class func jsonObject(with data: Data,
options opt: JSONSerialization.ReadingOptions = []) throws -> Any
bytebufferの普通のデータを入れる関数と、InputStreamを入れる関数があるみたい InputStreamとは?わかっているようで使い所がよくわかっていない。要はinputを抽象化しているのだと思うのだけど、横道にそれるので今後の課題にしておく。
- ReadingOptions
* static var mutableContainers: JSONSerialization.ReadingOptions
Specifies that arrays and dictionaries are created as mutable objects.
可変のオブジェクトとして、配列や辞書が作られるように指定
* static var mutableLeaves: JSONSerialization.ReadingOptions
JSONオブジェクトグラフの中のleaf stringをNSMutableStringインスタンスとして指定する
Specifies that leaf strings in the JSON object graph are created as instances of NSMutableString.
static var allowFragments: JSONSerialization.ReadingOptions
NSArrayかNSDictionaryのインスタンスではないトップレベルオブジェクトを許可する
Specifies that the parser should allow top-level objects that are not an instance of NSArray or NSDictionary.
ドキュメント読むとよくわからないが、どうやら、 全部可変 Stringが可変 不変 という意味らしい。基本はallowFragmentsで良さそう。今のところ困らないけど、いつか躓いた時に覚えるでしょう。
- task.resume()
リクエストの実行