LoginSignup
2

More than 5 years have passed since last update.

Swift3でバージョン文字列を比較する

Last updated at Posted at 2017-08-10

状況

今回は、アプリのバージョン文字列の大小を比較します。バージョン文字列は"1.2.3"などのような、文字列を単純に数値に変換することができません。

しかし、アプリの強制アップデート等の対策をする際には、必要とされるバージョンを示す文字列と、現在インストールされているアプリのバージョンを示す文字列を比較する必要があります。

[iOS]アプリに強制アップデート機能を導入すべき理由と、簡単に実装する方法

上記の実装だと下記の場合に正しく動作しません。今回の要件的に下記の場合に正しく動作しないのはよろしくありませんでした。

let required = "1.10.0"
let current = "1.2.0"
// required > current のはずなのに required < currentと判断されてします

コード

そこで、正しく動作しそうな関数を作ってみました。

/// required > currentの場合にtrueを返す関数
func isUpdateRequired(_ requiredVersion: String) -> Bool {
    let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String

    // Intの配列に変換
    var required = requiredVersion.components(separatedBy: ".").map{ Int($0) ?? 0 }
    var current = currentVersion.components(separatedBy: ".").map{ Int($0) ?? 0 }

    // 配列の長さの統一
    let diff = required.count - current.count
    let padding = Array(repeating: 0, count: abs(diff))
    if diff > 0 {
        current.append(contentsOf: padding)
    } else if diff < 0 {
        required.append(contentsOf: padding)
    }

    // 各インデックスの値を比較
    for (r, c) in zip(required, current) {
        if r > c {
            return true
        } else if r < c {
            return false
        }
    }

    return false
}

isUpdateRequired("1.10.0") // true or false

それほどしっかりと動作は試せていませんが、.で数値が区切られているものであれば正しく動作しそうです。もう少し良い書き方があればアドバイスください。

おわり。

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
2