##やりたいこと
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
以上