iOS 优雅的比较版本号

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

你可能感兴趣的:(iOS 优雅的比较版本号)