iOS 版本号比较

1,719 阅读1分钟

创建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