Bunun için bir araya getirdiğim bir işlevi paylaşacağımı düşündüm. Hiç de mükemmel değil. Lütfen örneklere ve sonuçlara bir göz atın. Ancak kendi sürüm numaralarınızı kontrol ediyorsanız (ki bunu veritabanı geçişleri gibi şeyleri yönetmek için yapmam gerekiyor) o zaman bu biraz yardımcı olabilir.
(ayrıca, yöntemdeki günlük ifadelerini de kaldırın, tabii ki. Bunların hepsi ne yaptığını görmenize yardımcı olmak için oradalar)
Testler:
[self isVersion:@"1.0" higherThan:@"0.1"];
[self isVersion:@"1.0" higherThan:@"0.9.5"];
[self isVersion:@"1.0" higherThan:@"0.9.5.1"];
[self isVersion:@"1.0.1" higherThan:@"1.0"];
[self isVersion:@"1.0.0" higherThan:@"1.0.1"];
[self isVersion:@"1.0.0" higherThan:@"1.0.0"];
[self isVersion:@"1.0b" higherThan:@"1.0a"];
[self isVersion:@"1.0a" higherThan:@"1.0b"];
[self isVersion:@"1.0a" higherThan:@"1.0a"];
[self isVersion:@"1.0" higherThan:@"1.0RC1"];
[self isVersion:@"1.0.1" higherThan:@"1.0RC1"];
Sonuçlar:
1.0 > 0.1
1.0 > 0.9.5
1.0 > 0.9.5.1
1.0.1 > 1.0
1.0.0 < 1.0.1
1.0.0 == 1.0.0
1.0b > 1.0a
1.0a < 1.0b
1.0a == 1.0a
1.0 < 1.0RC1 <-- FAILURE
1.0.1 < 1.0RC1 <-- FAILURE
alpha'nın çalıştığını fark et ama çok dikkatli olmalısın. Bir noktada alfaya gittiğinizde, arkasındaki diğer küçük sayıları değiştirerek bunu uzatamazsınız.
Kod:
- (BOOL) isVersion:(NSString *)thisVersionString higherThan:(NSString *)thatVersionString {
if ([thisVersionString compare:thatVersionString options:NSNumericSearch] == NSOrderedAscending) {
NSLog(@"%@ < %@", thisVersionString, thatVersionString);
return NO;
}
if ([thisVersionString compare:thatVersionString options:NSNumericSearch] == NSOrderedSame) {
NSLog(@"%@ == %@", thisVersionString, thatVersionString);
return NO;
}
NSLog(@"%@ > %@", thisVersionString, thatVersionString);
return YES;
}