创建NSString的分类实现版本比较。 具体实现方法是把NSString转字符数组char*,再按ASCII码值一一对比即可。
.h
@interface NSString (Compare)
/**
* @brief 比较字符串,用于版本比较
* @param str 被比较的字符串
* @return NSOrderedAscending -> self比str高 | NSOrderedSame -> self和str一致 | NSOrderedDescending -> self比str低
*/
- (NSComparisonResult)compareString:(NSString *)str;
@end
复制代码
.m
@implementation NSString (Compare)
- (NSComparisonResult)compareString:(NSString *)str {
long lenth = MIN(str.length, self.length);
const char *cstr = [str cStringUsingEncoding:NSASCIIStringEncoding];
const char *sstr = [self cStringUsingEncoding:NSASCIIStringEncoding];
for (int i = 0; i < lenth; i++) {
if (sstr[i] > cstr[i]) {
return NSOrderedAscending;
} else if (sstr[i] < cstr[i]) {
return NSOrderedDescending;
}
}
if (self.length > str.length) {
return NSOrderedAscending;
} else if (str.length > self.length) {
return NSOrderedDescending;
}
return NSOrderedSame;
}
@end
复制代码
上面这个方法有个Bug,当版本号为个位数是没问题的,双位数的时候比较会出错。 如:1.2.3和1.12.3比较 由于是按位比较,在比较第3个字符时2比1大,就会返回错误的结果。
重新写了一个方法,思路是以‘.’作为分隔符,分割之后补齐位数,再强转int进行比较。
@implementation NSString (Compare)
- (NSComparisonResult)compareString:(NSString *)str {
NSMutableArray<NSString *> *destinArr = [[str componentsSeparatedByString:@"."] mutableCopy];
NSMutableArray<NSString *> *sourceArr = [[self componentsSeparatedByString:@"."] mutableCopy];
int max = (int)MAX(destinArr.count, sourceArr.count);
for (int i = (int)MIN(destinArr.count, sourceArr.count); i < max; i++) {
!(sourceArr.count == i) ?: [sourceArr addObject:@"0"];
!(destinArr.count == i) ?: [destinArr addObject:@"0"];
}
for (int i = 0; i < sourceArr.count; i++) {
NSInteger n1 = [sourceArr[i] integerValue];
NSInteger n2 = [destinArr[i] integerValue];
if (n1 != n2) {
return n1 > n2 ? NSOrderedAscending : NSOrderedDescending;
}
}
return NSOrderedSame;
}
@end
复制代码