iOS 版本号比较

思路

  1. 首先通过正则表达式验证版本号格式是否正确

  2. 再对两个版本号进行比较

正则分析

首先开头是一个组合,该组合是开头为一个数字(该数字可能有多位),末尾是'.';并且这种组合有一组或多组;最后以数字(该数字可能有多位)结尾。

上代码

.h 

typedef NS_ENUM(NSInteger, VersionCompareType) {
    VersionCompareTypeError,
    VersionCompareTypeEqual,
    VersionCompareTypeLess,
    VersionCompareTypeGreater
};

@interface NSString (ValidVersion)

- (BOOL)isRightVersion;

+ (VersionCompareType)version1:(NSString *)v1 isGreaterThan:(NSString *)v2;

@end

.m

#import "NSString+ValidVersion.h"

@implementation NSString (ValidVersion)

+ (VersionCompareType)version:(NSString *)v1 isGreaterThan:(NSString *)v2 {
    if (![v1 isRightVersion] || ![v2 isRightVersion]) {
        return VersionCompareTypeError;
    }
    
    NSArray *v1Array = [v1 componentsSeparatedByString:@"."];
    NSArray *v2Array = [v2 componentsSeparatedByString:@"."];
    
    NSUInteger v1Count = v1Array.count;
    NSUInteger v2Count = v2Array.count;
    
    NSInteger count = MIN(v1Count, v2Count);
    VersionCompareType compareType = VersionCompareTypeEqual;
    for (int i = 0; i < count; i++) {
        NSString *item1 = v1Array[i];
        NSString *item2 = v2Array[i];
        if (item1 > item2) {
            compareType = VersionCompareTypeGreater;
            break;
        } else if (item1 < item2) {
            compareType = VersionCompareTypeLess;
            break;
        }
    }
    
    if (v1Count == v2Count ||
        compareType == VersionCompareTypeGreater ||
        compareType == VersionCompareTypeLess) {
        return compareType;
    }
    
    // if condictions don't match above, the temp value of compareType is VersionCompareTypeEqual.
    //    compareType = VersionCompareTypeEqual;
    if (v1Count > count) {
        for (NSUInteger i = count; i < v1Count; i++) {
            NSString *item = v1Array[i];
            if ([item integerValue] > 0) {
                compareType = VersionCompareTypeGreater;
                break;
            }
        }
    } else {
        for (NSUInteger i = count; v2Count; i++) {
            NSString *item = v2Array[i];
            if ([item integerValue] > 0) {
                compareType = VersionCompareTypeLess;
                break;
            }
        }
    }
    return compareType;
}

- (BOOL)isRightVersion {
    // this condition can't match the regex, don't need to judge.
    //    if (self == nil) return NO;

    //    NSString *regex = @"^([0-9]+[.]){1,}[0-9]{1,}$";
    NSString *regex = @"^(\\d+[.])+\\d+$";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    BOOL isMatch = [predicate evaluateWithObject:self];
    return isMatch;
}

demo地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 首先,先了解一下iOS版本号的规则 CFBundleShortVersionString(Version) Spe...
    SySean阅读 12,535评论 3 19
  • 在进行版本更新的时候,需要对当前版本和接口数据版本号就行判断比较,发现有多种的比较方式。 最简单的比较方式,采用字...
    我是要成为大神的男人阅读 2,571评论 0 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 希望 我多么希望, 陪你看星空漫天, 在海角天涯 沉默 我选择沉默, 哪怕, 你不了解我的心 外向 外向的人真好,...
    瘦瘦的小猪阅读 195评论 0 2
  • 今天晚上6点,我们开始了足球训练,我们都迫不及待了,刚开始我们踢了一场比赛,比赛进行的异常激烈,刚开始我们每次,...
    2e45075fd084阅读 140评论 0 0