2012-04-04 14 views
0

Mögliche Duplizieren:
How to do a natural sort on an NSArray?
Comparing version numbersvergleichen 2 Strings (die Zahlen sind)

ich meine App-Version als NSString gespeichert haben. Die Version hat das Format x.y.z oder x.y (wobei x, y, z ganze Zahlen darstellen).

Wenn ich 2 Versionen vergleichen möchte (dh 2 Strings, die 2 verschiedene/gleiche Versionen darstellen), was ist der beste Weg, dies zu tun?

Danke!

Sunny

+1

Probieren Sie es aus. Sie wollen die Zeichenkette durch die Punkte teilen, in Ints konvertieren, als Ihre Vergleiche. – sdolan

+1

Dies kann ein schwierigeres Problem sein, als man denken könnte, abhängig davon, wie Sie Dinge vergleichen müssen. Wenn Sie nur für genau die gleiche Verwendung vergleichen müssen, ist isEqualToString: ', aber wenn Sie relative Vergleiche und partielle Vergleiche machen müssen, dann bedarf es eines Gedankens und eines Plans, basierend darauf, wie viel Flexibilität Sie benötigen. (Beachten Sie jedoch, dass 'componentsSeparatedByString:' die ID-Nummer einer Punkt-getrennten Version gut trennen kann.) –

+0

danke @Saphrosit. Genau das suche ich. Soll ich diese Frage löschen? –

Antwort

0

Ich hatte das gleiche Problem und konnte es nicht funktionieren lassen. Ich entschied mich schließlich, Version mit NSNumber zu speichern ... speicherte mir viel Zeit ... also schlage ich vor, dass Sie dasselbe tun

wenn Sie bereits die Anwendung im App Store haben ... tun Sie einfach etwas wie:

Die Verwendung von NSString zum Speichern der Version mag zunächst eine gute Idee sein, aber es ist schwierig, wenn Sie versuchen, die App zu aktualisieren. Mit NSNumber ist einfacher, weil es ... well..uses Zahlen

so sah ich durch NSScanner Class Reference und kam mit dieser Lösung:

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]; 

es nicht schön ist, aber es sollte

+1

Die if-Anweisung in Ihrem Code ist redundant - wenn Sie eine Variable in einem 'NSString' speichern, wird überprüft, ob es ein' NSString' ist, wird immer einen wahren Wert zurückgeben ... –

+0

Leider funktioniert das nicht so wie ich ' m Lesen der aktuellen Version aus der Datei info.plist der App, wo sie als Zeichenfolge gespeichert wird. –

+0

hast du mehr als 1 version veröffentlicht? – skytz

0

arbeiten Es gibt etwa eine Million Möglichkeiten, wie Sie zu diesem gehen könnten, aber hier ist ein kurzes Beispiel:

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) 
    ); 
} 

Offensichtlich ist dies ein kleines Programm ist, wie versionStringComponents() trennt blind die Versionsnummern von einer Zeichenkette, verwandelt sie in Ints usw. Außerdem könnte es ein paar mehr Vergleichsfunktionen verwenden, aber ich bin sicher, dass Sie diese herausfinden können.

This link, wie mentioned by Saphrosit, ist ein viel kürzerer Weg zur Erledigung der gleichen Aufgabe, aber erfordert die Verwendung von Code aus dem Sparkle-Framework.