Edited at

SwiftyJSON 3系 → v4.0.0 にshimを

More than 1 year has passed since last update.


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 がテラ便利だよな!変更箇所が少なく済んでよかった。ちょっとずつ新しい挙動に乗り換える余裕ができた。