Takahiro Octopress Blog

-1から始める情弱プログラミング

今更だけど使ってみようSwiftyJson

SwiftyJsonの便利さを改めて確かめてみる

さて、筆者の個人的な諸事情により、なかなか時間が取れないため、
完全に新しいことを書けないでいる今日このごろです。
今更ながら書くか否か迷ったのですが、
折角、習慣化しているブログ投稿をSTOPさせたくもないので、
Swift屋にとっては当たり前となっているであろうSwiftyJsonについて書こうと思います。
何を隠そう、筆者は今までSwiftyJsonの存在は把握していたものの、
自身で変換して書くことに拘っていたので触っていませんでした。
がしかし、食わず嫌いは如何なものかということで触ってみることにしました。

CocoaPodsでインストール

まずは、インストールです。
CocoaPods, Carthage, Swift Package Managerに対応した良心的なライブラリです。
筆者はいつも通りCocoaPodsを使います。
今回もOpen Weather Map APIをサンプルに利用したいのでAlamofireも合わせてインストールします。

1
2
3
4
5
6
7
platform :ios, '8.0'
use_frameworks!

target 'SwiftyJsonSample' do
  pod 'Alamofire', '~> 3.0'
  pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git'
end

SwiftyJsonで何が便利になったのか

さて、早速、SwiftyJsonを使うことで何が便利になるのか見てみたいと思います。
まずは、便利にする前のベースのコードをご覧下さい。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Alamofire.request(.GET, "http://api.openweathermap.org/data/2.5/weather?APPID=<あなた自身のAPPID>",
  parameters:["q":location]).responseJSON { (response) -> Void in
      if response.result.isSuccess {
          guard let value = response.result.value else {
              // 値の取得に失敗した場合
              return
          }
          guard let weatherArray:AnyObject? = value["weather"] else {
              // 値の取得に失敗した場合
              return
          }
          guard let weather = weatherArray?[0] else {
              // 値の取得に失敗した場合
              return
          }
          guard let description = weather["description"] as? String else {
              // 値の取得に失敗した場合
              return
          }

          print(description)
      }
}

前回の記事で紹介したguard statementを使うことでネストが浅くなっていますね。
これはわかりやすさのために、バラけて書いたのですが、
元々 description の値が欲しいのであれば、

1
2
3
4
5
6
7
8
9
10
Alamofire.request(.GET, "http://api.openweathermap.org/data/2.5/weather?APPID=<あなた自身のAPPID>",
  parameters:["q":location]).responseJSON { (response) -> Void in
      if response.result.isSuccess {
          guard let description = response.result.value?["weather"]??[0]["description"] else {
              // 値の取得に失敗した場合
              return
          }
          print(description!)
      }
}

とすればかなり短く書けます。
しかしながら、素人にとって オプショナル型アンラップ は相当わかりにくいと言えます。
これがSwiftyJsonを利用することで細かい上記のことを気にすることなく、
WEBで扱うようにJSONを扱えます。
もちろんSwiftでは重要なことなので、
どこよりも分かりやすいSwiftの”?“と”!”を参考に正しく理解しましょう。

さて、SwiftyJsonを使うと次のように書けます。

1
2
3
4
5
6
7
8
9
10
11
12
13
Alamofire.request(.GET, "http://api.openweathermap.org/data/2.5/weather?APPID=<あなた自身のAPPID>",
  parameters:["q":location]).responseJSON { (response) -> Void in
      if response.result.isSuccess {
          guard let data = response.result.value else {
              return
          }
          let json = JSON(data)
          guard let description = json["weather"][0]["description"] else {
              return
          }
          print(description)
      }
}

多少行数は増えているものの、
オプショナル型アンラップ化 を気にせず書けていることがわかると思います。
そう、まるでWEBでJSONを扱うかのように…。

オプショナル型の値が内部にオプショナル型の値を持っているなど、
??と書く状況を作りかねないことがあってもSwiftyJsonでは考えなくて良いんですね。
う〜ん。便利。

他にもたくさんの使い道があるため機会があれば積極的に利活用していこうと思います。
また、これまでスルーしてきた他の便利ライブラリについてもちょくちょくその便利さを追求していこうと思います。

と言ったところで本日はここまで。

Comments