[objective-c] Objective-C에서 버전 번호 비교

항목과 버전 번호가있는 데이터를받는 응용 프로그램을 작성 중입니다. 숫자는 “1.0.1”또는 “1.2.5”와 같은 형식입니다. 이 버전 번호를 어떻게 비교할 수 있습니까? 먼저 문자열로 형식을 지정해야한다고 생각합니다. “1.2.5”가 “1.0.1”뒤에 오는지 확인하려면 어떤 옵션이 필요합니까?



답변

“1”< “1.0”< “1.0.0”을 염두에두고 버전을 비교하는 가장 간단한 방법입니다.

NSString* requiredVersion = @"1.2.0";
NSString* actualVersion = @"1.1.5";

if ([requiredVersion compare:actualVersion options:NSNumericSearch] == NSOrderedDescending) {
  // actualVersion is lower than the requiredVersion
}


답변

엄격하게 숫자 버전 (a, b, RC 등 없음)을 여러 구성 요소와 비교하는 방법을 추가하겠습니다.

+ (NSComparisonResult)compareVersion:(NSString*)versionOne toVersion:(NSString*)versionTwo {
    NSArray* versionOneComp = [versionOne componentsSeparatedByString:@"."];
    NSArray* versionTwoComp = [versionTwo componentsSeparatedByString:@"."];

    NSInteger pos = 0;

    while ([versionOneComp count] > pos || [versionTwoComp count] > pos) {
        NSInteger v1 = [versionOneComp count] > pos ? [[versionOneComp objectAtIndex:pos] integerValue] : 0;
        NSInteger v2 = [versionTwoComp count] > pos ? [[versionTwoComp objectAtIndex:pos] integerValue] : 0;
        if (v1 < v2) {
            return NSOrderedAscending;
        }
        else if (v1 > v2) {
            return NSOrderedDescending;
        }
        pos++;
    }

    return NSOrderedSame;
}


답변

이것은 1 <1.0 <1.0.0 등의 문제를 해결하기 위해 Nathan de Vries 답변의 확장입니다.

먼저 NSString카테고리를 사용하여 버전 문자열에서 추가 “.0″문제를 해결할 수 있습니다 .

@implementation NSString (VersionNumbers)
- (NSString *)shortenedVersionNumberString {
    static NSString *const unnecessaryVersionSuffix = @".0";
    NSString *shortenedVersionNumber = self;

    while ([shortenedVersionNumber hasSuffix:unnecessaryVersionSuffix]) {
        shortenedVersionNumber = [shortenedVersionNumber substringToIndex:shortenedVersionNumber.length - unnecessaryVersionSuffix.length];
    }

    return shortenedVersionNumber;
}
@end

위의 NSString카테고리를 사용하면 불필요한 .0을 삭제하기 위해 버전 번호를 줄일 수 있습니다.

NSString* requiredVersion = @"1.2.0";
NSString* actualVersion = @"1.1.5";

requiredVersion = [requiredVersion shortenedVersionNumberString]; // now 1.2
actualVersion = [actualVersion shortenedVersionNumberString]; // still 1.1.5

이제 우리는 Nathan de Vries가 제안한 아름답고 간단한 접근 방식을 사용할 수 있습니다.

if ([requiredVersion compare:actualVersion options:NSNumericSearch] == NSOrderedDescending) {
  // actualVersion is lower than the requiredVersion
}


답변

직접 만들었습니다. 카테고리 사용 ..

출처..

@implementation NSString (VersionComparison)
- (NSComparisonResult)compareVersion:(NSString *)version{
    NSArray *version1 = [self componentsSeparatedByString:@"."];
    NSArray *version2 = [version componentsSeparatedByString:@"."];
    for(int i = 0 ; i < version1.count || i < version2.count; i++){
        NSInteger value1 = 0;
        NSInteger value2 = 0;
        if(i < version1.count){
            value1 = [version1[i] integerValue];
        }
        if(i < version2.count){
            value2 = [version2[i] integerValue];
        }
        if(value1  == value2){
            continue;
        }else{
            if(value1 > value2){
                return NSOrderedDescending;
            }else{
                return NSOrderedAscending;
            }
        }
    }
    return NSOrderedSame;
}

테스트..

NSString *version1 = @"3.3.1";
NSString *version2 = @"3.12.1";
NSComparisonResult result = [version1 compareVersion:version2];
switch (result) {
    case NSOrderedAscending:
    case NSOrderedDescending:
    case NSOrderedSame:
         break;
    }


답변

Sparkle (MacOS에서 가장 널리 사용되는 소프트웨어 업데이트 프레임 워크)에는이를 수행하는 SUStandardVersionComparator 클래스 가 있으며 빌드 번호와 베타 마커도 고려합니다. 즉, 1.0.5 > 1.0.5b7또는 2.0 (2345) > 2.0 (2100). 코드는 Foundation 만 사용하므로 iOS에서도 잘 작동합니다.


답변

github에서 쉬운 버전 검사를 구현하는 내 NSString 카테고리를 확인하십시오. https://github.com/stijnster/NSString-compareToVersion

[@"1.2.2.4" compareToVersion:@"1.2.2.5"];

그러면 사용하는 것보다 더 정확한 NSComparisonResult 가 반환 됩니다.

[@"1.2.2" compare:@"1.2.2.5" options:NSNumericSearch]

도우미도 추가됩니다.

[@"1.2.2.4" isOlderThanVersion:@"1.2.2.5"];
[@"1.2.2.4" isNewerThanVersion:@"1.2.2.5"];
[@"1.2.2.4" isEqualToVersion:@"1.2.2.5"];
[@"1.2.2.4" isEqualOrOlderThanVersion:@"1.2.2.5"];
[@"1.2.2.4" isEqualOrNewerThanVersion:@"1.2.2.5"];


답변

Swift 2.2 버전 :

let currentStoreAppVersion = "1.10.2"
let minimumAppVersionRequired = "1.2.2"
if currentStoreAppVersion.compare(minimumAppVersionRequired, options: NSStringCompareOptions.NumericSearch) ==
            NSComparisonResult.OrderedDescending {
            print("Current Store version is higher")
        } else {
            print("Latest New version is higher")
        }

Swift 3 버전 :

let currentStoreVersion = "1.1.0.2"
let latestMinimumAppVersionRequired = "1.1.1"
if currentStoreVersion.compare(latestMinimumAppVersionRequired, options: NSString.CompareOptions.numeric) == ComparisonResult.orderedDescending {
print("Current version is higher")
} else {
print("Latest version is higher")
}