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
引数を一切使っていないので新規に生やすのがとても簡単だった。
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
がテラ便利だよな!変更箇所が少なく済んでよかった。ちょっとずつ新しい挙動に乗り換える余裕ができた。