可能重复:
如何对 NSArray 进行自然排序?
比较版本号
我将我的应用程序版本保存为 NSString。版本采用 xyz 或 xy 格式(其中 x,y,z 表示整数)。
如果我想比较 2 个版本(即:代表 2 个不同/相同版本的 2 个字符串),最好的方法是什么?
谢谢!
晴天
可能重复:
如何对 NSArray 进行自然排序?
比较版本号
我将我的应用程序版本保存为 NSString。版本采用 xyz 或 xy 格式(其中 x,y,z 表示整数)。
如果我想比较 2 个版本(即:代表 2 个不同/相同版本的 2 个字符串),最好的方法是什么?
谢谢!
晴天
我有同样的问题,无法让它工作。我终于决定用 NSNumber 保存版本...为我节省了很多时间...所以我建议你也这样做
如果您已经在 App Store 中拥有该应用程序......只需执行以下操作:
NSString *string = <get version>
if ([string isKindOfClass:[NSString class]]){
update version and save as NSNumber
}
使用 NSString 保存版本一开始似乎是个好主意,但当您尝试更新应用程序时它会很棘手。使用 NSNumber 更容易,因为它......好吧..使用数字
所以我查看了NSScanner 类参考并提出了这个解决方案:
int i1,i2,i3;
NSScanner *scanner =[NSScanner alloc]initWithString:string];
BOOL scanI1 = [scanner scanInteger:&i1];
[scanner setScanLocation:3];
BOOL scanI2 = [scanner scanInteger:&i2];
[scanner setScanLocation:5];
BOOL scanI3 = [scanner scanInteger:&i3];
[scanner release];
它不漂亮,但应该可以
有大约一百万种方法可以解决这个问题,但这里有一个简单的例子:
void versionStringComponents(NSString* versionStr_, NSInteger* major__, NSInteger* minor__, NSInteger* bugfix__)
{
NSArray* elements = [versionStr_ componentsSeparatedByString:@"."];
*major__ = [[elements objectAtIndex:0] intValue];
*minor__ = [[elements objectAtIndex:1] intValue];
*bugfix__ = 0;
if([elements count] > 2)
{
*bugfix__ = [[elements objectAtIndex:2] intValue];
}
}
bool versionLessThan(NSString* versionStr1_, NSString* versionStr2_)
{
NSInteger major1 = 0, minor1 = 0, bugfix1 = 0;
versionStringComponents(versionStr1_, &major1, &minor1, &bugfix1);
NSInteger major2 = 0, minor2 = 0, bugfix2 = 0;
versionStringComponents(versionStr2_, &major2, &minor2, &bugfix2);
return (
major1 < major2 ||
(major1 == major2 && minor1 < minor2) ||
(major1 == major2 && minor1 == minor2 && bugfix1 < bugfix2)
);
}
显然这是一个快速的小技巧,因为versionStringComponents()
只是盲目地将版本号与字符串分开,将它们转换为整数等。此外,它可以使用更多的比较函数,但我相信你可以弄清楚这些。
正如Saphrosit所提到的,此链接是完成相同任务的更短的方法,但需要使用 Sparkle 框架中的代码。