compare() 方法可以直接对版本进行比较
这个是错误的!!!
这是之前在网上搜到的使用方法以为是正确的,突然发现10.0与9.0比较得到的结果是错误的,仔细研究了一下,发现compare的比较方式是按位比较, 所以10.0与9.0的比较其实得到的结果是 1<9!!!
感谢评论区 @saberyy 同学
compare方法入参中的options可以传String.CompareOptions.numeric 表示按照数字字符串进行比较 ,比较原理不清楚,但是测试了以下几种代码,确实完美解决,各种长度的版本号都没问题
"9.1".compare("10.1.1.02", options: String.CompareOptions.numeric, range: nil, locale: nil)
"9.0.1".compare("10.1.1.02", options: String.CompareOptions.numeric, range: nil, locale: nil)
"10.1.1.03".compare("10.1.1.02", options: String.CompareOptions.numeric, range: nil, locale: nil)
"10.1.1.02".compare("10.1.1.02", options: String.CompareOptions.numeric, range: nil, locale: nil)
以下忽略
查找了一些其他方案,没有什么完美的解决方案,只能自己封装一个String的extension方法,思路很简单,以“.”分隔,得到数组,然后按每一个下标比较
```
public func versionCompare(_compareVersion:String) -> ComparisonResult {
//将两个版本号以“.”拆分成数组
let currentVersions = self.base.components(separatedBy:".")
let compareVersions = compareVersion.components(separatedBy:".")
//分别比较每一位的大小
let count = (currentVersions.count< compareVersions.count) ? currentVersions.count: compareVersions.count
for i in 0..<count
if let current =Int(currentVersions[i]), let compare = Int(compareVersions[i]) {
if current > compare {
return ComparisonResult.orderedDescending
}else if current < compare {
return ComparisonResult.orderedAscending
}
}
}
//经过上面的for后还没有比较出来,说明两者相同位的版本号都相同,剩下的则看谁的版本号更长,长的则表示版本号大。例:11.0.1 < 11.0.1.1
if currentVersions.count< compareVersions.count{
return ComparisonResult.orderedAscending
}else if currentVersions.count> compareVersions.count{
return ComparisonResult.orderedDescending
}else{
return ComparisonResult.orderedSame
}
}
```
ComparisonResult.orderedDescending 表示降序,即currentVersion > compareVersion
ComparisonResult.orderedAscending 表示升序,即currentVersion < compareVersion
ComparisonResult.orderedSame 表示相等,即currentVersion = compareVersion
网友评论