0

可能重复:
如何对 NSArray 进行自然排序?
比较版本号

我将我的应用程序版本保存为 NSString。版本采用 xyz 或 xy 格式(其中 x,y,z 表示整数)。

如果我想比较 2 个版本(即:代表 2 个不同/相同版本的 2 个字符串),最好的方法是什么?

谢谢!

晴天

4

2 回答 2

0

我有同样的问题,无法让它工作。我终于决定用 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];

它不漂亮,但应该可以

于 2012-04-04T00:36:33.970 回答
0

有大约一百万种方法可以解决这个问题,但这里有一个简单的例子:

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 框架中的代码。

于 2012-04-04T01:10:29.380 回答