重複の可能性:
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 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];
それはきれいではありませんが、うまくいくはずです
これには約 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 フレームワークのコードを使用する必要があります。