Help us understand the problem. What is going on with this article?

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

execjosh
software engineer: infrastructure, web {back,front}end, iOS. Currently using Go for backend development.
https://execjosh.blogspot.com
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away