2012-04-04 73 views
0

可能重複:
How to do a natural sort on an NSArray?
Comparing version numbers比較兩個字符串(包含數字)

我有我的應用程序版本保存爲一個NSString。版本格式爲x.y.z或x.y(其中x,y,z表示整數)。

如果我想比較2個版本(即:代表2個不同/相同版本的2個字符串),那麼執行此操作的最佳方法是什麼?

謝謝!

Sunny

+1

試試看。你會想要按照句點拆分字符串,轉換爲整數,而不是比較。 – sdolan 2012-04-04 00:24:42

+1

這可能是一個比人們想象的更難的問題,這取決於你需要如何比較事物。如果您只需比較「isEqualToString:」的完全平等使用情況,但如果您需要進行相對比較和部分比較,則需要根據您需要的靈活性進行思考和計劃。 (但是請注意'componentsSeparatedByString:'可以很好地劃分一個以點分隔的版本ID。) – 2012-04-04 00:33:14

+0

謝謝@Saphrosit。這正是我正在尋找的東西。我應該刪除這個問題嗎? – 2012-04-04 01:02:44

回答

0

我有同樣的問題,無法使它工作。我終於決定用NSNumber保存版本...爲我節省了很多時間...所以我建議你也這樣做

如果你已經在App Store中有這個應用程序...只是做一些事情:

NSString *string = <get version> 
if ([string isKindOfClass:[NSString class]]){ 
update version and save as NSNumber 
} 

使用NSString保存版本最初看起來是個不錯的主意,但當您嘗試更新應用程序時,它的技巧非常棘手。使用的NSNumber更加容易,因爲...... well..uses數字

,所以我看遍了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]; 

它不漂亮,但它應該工作

+1

你的代碼中的if語句是多餘的 - 如果你將一個變量保存到'NSString'中,檢查它是否是'NSString'將總是返回一個真值... – 2012-04-04 00:40:01

+0

不幸的是, m從應用程序的info.plist中讀取當前版本,並將其存儲爲字符串。 – 2012-04-04 00:42:05

+0

你有超過1個版本發佈嗎? – skytz 2012-04-04 00:43:53

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()只是盲目地從字符串中分離版本號,將它們轉換爲整數等。此外,它可以使用更多的比較函數,但我相信你可以把它們弄清楚。

This link,作爲mentioned by Saphrosit,是完成相同任務的更短的方法,但需要使用Sparkle框架中的代碼。