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)
}