LoginSignup
4
1

More than 5 years have passed since last update.

SwiftyJSON 3系 → v4.0.0 にshimを

Last updated at Posted at 2018-03-06

tl;dr

JSON(data:options:)の挙動が変わったが、前の挙動を再現するextensionを作る事でコードベースを変更しなくてよく済んだ。

武勇伝

プロジェクトの現状

  • Swift 3
  • SwiftJSON v3.1.4 固定
  • コードベースがデカい
$ pod outdated
The following pod updates are available:
- SwiftyJSON 3.1.4 -> 3.1.4 (latest version 4.0.0)

やっぱり最新版を使いたい。

取り敢えず上げる

  • Podfile編集
  • pod update SwiftJSON

OK。ビルドしてみよう。

Call can throw, but it is not marked with 'try' and the error is not handled

コンパイルエラーは出まくる

なんでやねんwwww

まあ、そうやなぁ、メジャーバージョンアップやもんな。

何が変わった?

SwiftyJSON now use throws for error handling

JSON(data:options:) がこれまでは例外を握り潰していたらしい。しかし、それではよくないと。例外をスルーするから try を使わなければいけないと。

なるほど。

レガシーなコードベースで JSON(data:options:)nil を返さない前提で作られているから、やたらと (try? JSON(data: data)) ?? JSON(jsonObject: NSNull()) を振り回してみても直ぐ数百箇所のdiffががが、、、、、、

そうだ extension を作ろう!

一旦、以前の挙動を維持する為に extension を活かすことにした。

不幸中の幸い、 options 引数を一切使っていないので新規に生やすのがとても簡単だった。

SwiftyJSONExtensions.swift
import SwiftyJSON

public extension JSON {
    // Compatiblility shim for updating to SwiftyJSON v4.0.0
    // See changes introduced by: https://github.com/SwiftyJSON/SwiftyJSON/pull/833
    init(data: Data) {
        do {
            try self.init(data: data, options: [])
        } catch {
            self.init(jsonObject: NSNull())
        }
    }
}

おわり

こういう時に extension がテラ便利だよな!変更箇所が少なく済んでよかった。ちょっとずつ新しい挙動に乗り換える余裕ができた。

4
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1