iOS 版本号比较

本文介绍了一种用于比较软件版本号的NSString分类实现方法。通过将版本号字符串分割并转换为整数数组,再逐一比较各部分数值大小来确定版本高低。此方法解决了传统逐字符比较的缺陷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建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
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值