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 Class Referenceを調べて、この解決策を思いつきました:

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

これには約 100 万通りの方法がありますが、簡単な例を次に示します。

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()バージョン番号を文字列からやみくもに分離し、それらをintに変換するなど、明らかにこれは簡単なハックです。また、さらにいくつかの比較関数を使用できますが、それらを理解できると確信しています。

Saphrosit が言及したこのリンクは、同じタスクを達成するためのはるかに短い方法ですが、Sparkle フレームワークのコードを使用する必要があります。

于 2012-04-04T01:10:29.380 に答える