В общем, лучше спросить, может ли объект выполнить данный селектор, а не проверять номер версии, чтобы решить, должен ли он присутствовать.
Если это не вариант, вам нужно будьте немного осторожны, потому что [@"5.0" compare:@"5" options:NSNumericSearch]
возвращает NSOrderedDescending
, который вообще не может быть предназначен; Я мог бы ожидать здесь NSOrderedSame
. Это, по крайней мере, теоретическая проблема, на которую, по моему мнению, стоит защищаться.
Также стоит подумать о возможности ввода плохой версии, с которой нельзя разумно сравнить. Apple поставляет три предопределенные константы NSOrderedAscending
, NSOrderedSame
и NSOrderedDescending
, но я могу подумать об использовании для некоторой вещи, названной NSOrderedUnordered
, в случае, если я не могу сравнивать две вещи, и я хочу вернуть значение, указывающее это .
Более того, не исключено, что Apple когда-нибудь расширит свои три предопределенные константы, чтобы обеспечить множество возвращаемых значений, делая сравнение != NSOrderedAscending
неразумным.
, рассмотрим следующий код.
typedef enum {kSKOrderedNotOrdered = -2, kSKOrderedAscending = -1, kSKOrderedSame = 0, kSKOrderedDescending = 1} SKComparisonResult;
@interface SKComparator : NSObject
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo;
@end
@implementation SKComparator
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo {
if (!vOne || !vTwo || [vOne length] < 1 || [vTwo length] < 1 || [vOne rangeOfString:@".."].location != NSNotFound ||
[vTwo rangeOfString:@".."].location != NSNotFound) {
return SKOrderedNotOrdered;
}
NSCharacterSet *numericalCharSet = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];
NSString *vOneTrimmed = [vOne stringByTrimmingCharactersInSet:numericalCharSet];
NSString *vTwoTrimmed = [vTwo stringByTrimmingCharactersInSet:numericalCharSet];
if ([vOneTrimmed length] > 0 || [vTwoTrimmed length] > 0) {
return SKOrderedNotOrdered;
}
NSArray *vOneArray = [vOne componentsSeparatedByString:@"."];
NSArray *vTwoArray = [vTwo componentsSeparatedByString:@"."];
for (NSUInteger i = 0; i < MIN([vOneArray count], [vTwoArray count]); i++) {
NSInteger vOneInt = [[vOneArray objectAtIndex:i] intValue];
NSInteger vTwoInt = [[vTwoArray objectAtIndex:i] intValue];
if (vOneInt > vTwoInt) {
return kSKOrderedDescending;
} else if (vOneInt < vTwoInt) {
return kSKOrderedAscending;
}
}
if ([vOneArray count] > [vTwoArray count]) {
for (NSUInteger i = [vTwoArray count]; i < [vOneArray count]; i++) {
if ([[vOneArray objectAtIndex:i] intValue] > 0) {
return kSKOrderedDescending;
}
}
} else if ([vOneArray count] < [vTwoArray count]) {
for (NSUInteger i = [vOneArray count]; i < [vTwoArray count]; i++) {
if ([[vTwoArray objectAtIndex:i] intValue] > 0) {
return kSKOrderedAscending;
}
}
}
return kSKOrderedSame;
}
@end