Base Swift 3.1,Xcode 8.3.2
很多人選擇用分割數組、按個比較的方式來做,這樣是可以實現這個功能的,但是不那么優雅,iOS SDK 已經提供了必要的方法,就沒有必要重復造輪子了。
下面利用
String
提供的compare
方法,擴展了一下String
extension String
{
func ck_compare(with version: String) -> ComparisonResult {
return compare(version, options: .numeric, range: nil, locale: nil)
}
func isNewer(than aVersionString: String) -> Bool {
return ck_compare(with: aVersionString) == .orderedDescending
}
func isOlder(than aVersionString: String) -> Bool {
return ck_compare(with: aVersionString) == .orderedAscending
}
func isSame(to aVersionString: String) -> Bool {
return ck_compare(with: aVersionString) == .orderedSame
}
}
首先提供了一個 “萬能方法”,用來獲取兩個字符串按照數字的方式比較的結果。第二個參數 options
這里提供的值是 .numeric
,這個枚舉值可以使字符串的比較依據變成數字,但不是單純的按字符比較,而是將連續的數字當作一個自然語言中的數字,比如10.3.1
,第一個數字是10。
然后針對不同的場景,提供了三個便捷方法,可以快速的調用。
PS: Objective-C 亦有同樣的 API,如有需要可以自己封裝。
進一步的,我們可以封裝一些針對 iOS 系統版本的 API
import UIKit
/// 用于判斷當前系統版本是否低于指定版本
func systemVersion(below aVersionString: String) -> Bool
{
return UIDevice.current.systemVersion.isOlder(than: aVersionString)
}
/// 用于判斷當前系統版本是否高于指定版本
func systemVersion(over aVersionString: String) -> Bool
{
return UIDevice.current.systemVersion.isNewer(than: aVersionString)
}
/// 用于判斷當前系統版本是否等于指定版本
func systemVersion(sameAs aVersionString: String) -> Bool
{
return UIDevice.current.systemVersion.isSame(as: aVersionString)
}