Jak używać porównania na numerze wersji, gdzie jest mniej części w jednym numerze w Objective-C?
Znalazłem następujący kod pod adresemhttp://snipplr.com/view/2771
Co jest całkiem dobre, prawie dokładnie to, czego szukałem, ale jeśli użyję tych wartości@"1.4.5", @"10.4"
daje niewłaściwy wynik, mówiąc, że pierwsza liczba jest niższa.
Arghhhh Kodowanie późno w nocy, przepraszam, przeczytałem 10.4 jako 1.4 :(
Nie jestem pewien, dlaczego problem dotyczy porównania i na czym polega problem?
/*
* compareVersions(@"10.4", @"10.3"); //
returns NSOrderedDescending (1) - aka first number is higher
* compareVersions(@"10.5", @"10.5.0"); //
returns NSOrderedSame (0)
* compareVersions(@"10.4 Build 8L127", @"10.4 Build 8P135"); //
returns NSOrderedAscending (-1) - aka first number is lower
*/
NSComparisonResult compareVersions(NSString* leftVersion, NSString* rightVersion)
{
int i;
// Break version into fields (separated by '.')
NSMutableArray *leftFields = [[NSMutableArray alloc] initWithArray:[leftVersion componentsSeparatedByString:@"."]];
NSMutableArray *rightFields = [[NSMutableArray alloc] initWithArray:[rightVersion componentsSeparatedByString:@"."]];
// Implict ".0" in case version doesn't have the same number of '.'
if ([leftFields count] < [rightFields count]) {
while ([leftFields count] != [rightFields count]) {
[leftFields addObject:@"0"];
}
} else if ([leftFields count] > [rightFields count]) {
while ([leftFields count] != [rightFields count]) {
[rightFields addObject:@"0"];
}
}
.
// Do a numeric comparison on each field
for(i = 0; i < [leftFields count]; i++) {
NSComparisonResult result = [[leftFields objectAtIndex:i] compare:[rightFields objectAtIndex:i] options:NSNumericSearch];
if (result != NSOrderedSame) {
[leftFields release];
[rightFields release];
return result;
}
}
[leftFields release];
[rightFields release];
return NSOrderedSame;
}