7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Swift] バージョン番号文字列の新旧比較をする。

Last updated at Posted at 2021-09-13

##やりたいこと

x.y.z 形式のバージョン番号について、2つのバージョン番号間でどちらが新しいバージョンかをSwiftのコードで判定したい。

バージョン番号の比較例
2.0 > 1.5.1
1.6 > 1.5.24
1.10.1 > 1.7.55
1.5.3 < 1.5.11

ここでの前提として、バージョン番号はString型で定義されているものとします。

##よくある間違い

検索してよく出てくる方法は、単純にcompareメソッドを使って文字列比較する方法です。

let result = ver1.compare(ver2)

switch result {
case .orderedAscending:
    print("ascending")
case .orderedSame:
    print("same")
case .orderedDescending:
    print("descending")
}

この方法はよく見かけるのですが、問題があります。
問題がある場合の例を以下に示します。

ver1 = "1.6" ver2 = "1.5.1" の場合
 descending  正しい結果!

ver1 = "1.10.1" ver2 = "1.7.55" の場合 
 ascending  ★間違った結果★
 (1.10.1 は 1.7.55より新しいので、 decendingと出力されるべき。)

単純にcompareメソッドを使う比較方法では、各レベルの数字で比較する際に桁数が違うと正しい結果になりません。
上記の例では、文字列として比較されて 10 が 7 よりも先だと判定されてしまうため、上記のような誤った結果となってしまいます。

##正しい方法

ではどうすればよいか。
「数字として比較する」オプションをつければ良いです。

let result = ver1.compare(ver2, options: [.numeric])

switch result {
case .orderedAscending:
    print("ascending")
case .orderedSame:
    print("same")
case .orderedDescending:
    print("descending")
}

ver1 = "1.6" ver2 = "1.5.1" の場合
 → descending 正しい結果!

ver1 = "1.10.1" ver2 = "1.7.55" の場合 
 → descending 正しい結果!

というわけで、compareでの比較時に .numeric オプションを忘れずにつけるようにしましょう。

##動作確認環境

Xcode: 12.5
iOS: 14.7.1
Swiftバージョン: Swift 5.4

以上

7
6
0

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
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?