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,540評論 3 19
  • 在進行版本更新的時候,需要對當前版本和接口數據版本號就行判斷比較,發現有多種的比較方式。 最簡單的比較方式,采用字...
    我是要成為大神的男人閱讀 2,572評論 0 1
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,270評論 0 4
  • 希望 我多么希望, 陪你看星空漫天, 在海角天涯 沉默 我選擇沉默, 哪怕, 你不了解我的心 外向 外向的人真好,...
    瘦瘦的小豬閱讀 195評論 0 2
  • 今天晚上6點,我們開始了足球訓練,我們都迫不及待了,剛開始我們踢了一場比賽,比賽進行的異常激烈,剛開始我們每次,...
    2e45075fd084閱讀 140評論 0 0