Ich schreibe eine Anwendung, die Daten mit Artikeln und Versionsnummern empfängt. Die Zahlen sind wie "1.0.1" oder "1.2.5" formatiert. Wie kann ich diese Versionsnummern vergleichen? Ich denke, sie müssen zuerst als String formatiert werden, oder? Welche Optionen muss ich haben, um festzustellen, dass "1.2.5" nach "1.0.1" kommt?
objective-c
comparison
Mlecho
quelle
quelle
Antworten:
Dies ist der einfachste Weg, um Versionen zu vergleichen, wobei zu beachten ist, dass "1" <"1.0" <"1.0.0":
quelle
componentsSeparatedByString
Ansatz). Sie können dies selbst mit@"1.8"
vs testen@"1.7.2.3.55"
und sehen, dass 1.8 die Nase vorn hat.Ich werde meine Methode hinzufügen, die streng numerische Versionen (no a, b, RC usw.) mit einer beliebigen Anzahl von Komponenten vergleicht.
quelle
Dies ist eine Erweiterung der Antwort von Nathan de Vries, um das Problem 1 <1.0 <1.0.0 usw. anzugehen.
Zunächst können wir das Problem der zusätzlichen ".0" in unserer Versionszeichenfolge mit einer
NSString
Kategorie behandeln:Mit der obigen
NSString
Kategorie können wir unsere Versionsnummern kürzen, um die unnötigen .0 zu löschenJetzt können wir noch den wunderbar einfachen Ansatz von Nathan de Vries verwenden:
quelle
Ich habe es selbst gemacht, benutze Kategorie ..
Quelle..
Prüfung..
quelle
Sparkle (das beliebteste Software-Update-Framework für MacOS) verfügt über eine SUStandardVersionComparator- Klasse, die dies tut und auch Build-Nummern und Beta-Marker berücksichtigt. Dh es vergleicht richtig
1.0.5 > 1.0.5b7
oder2.0 (2345) > 2.0 (2100)
. Der Code verwendet nur Foundation und sollte daher auch unter iOS einwandfrei funktionieren.quelle
Schauen Sie sich meine NSString-Kategorie an, die eine einfache Versionsprüfung auf Github implementiert. https://github.com/stijnster/NSString-compareToVersion
Dies gibt ein NSComparisonResult zurück, das genauer ist als die Verwendung von;
Helfer werden ebenfalls hinzugefügt.
quelle
Swift 2.2 Version:
Swift 3 Version:
quelle
Ich dachte, ich würde nur eine Funktion teilen, die ich dafür zusammengestellt habe. Es ist überhaupt nicht perfekt. Bitte schauen Sie sich die Beispiele und Ergebnisse an. Aber wenn Sie Ihre eigenen Versionsnummern überprüfen (was ich tun muss, um Dinge wie Datenbankmigrationen zu verwalten), kann dies ein wenig helfen.
(Entfernen Sie natürlich auch die Protokollanweisungen in der Methode. Diese dienen dazu, Ihnen zu zeigen, was alles bewirkt.)
Tests:
Ergebnisse:
Beachten Sie, dass Alpha funktioniert, aber Sie müssen sehr vorsichtig damit sein. Sobald Sie irgendwann Alpha werden, können Sie dies nicht mehr erweitern, indem Sie andere kleinere Zahlen dahinter ändern.
Code:
quelle
Meine iOS-Bibliothek AppUpdateTracker enthält eine NSString-Kategorie , um diese Art von Vergleich durchzuführen. (Die Implementierung basiert auf der Antwort von DonnaLea .)
Die Verwendung wäre wie folgt:
Darüber hinaus können Sie damit den Installations- / Aktualisierungsstatus Ihrer App verfolgen:
quelle
quelle
Glibc hat eine Funktion
strverscmp
undversionsort
… ist leider nicht auf das iPhone tragbar, aber Sie können Ihre eigene ziemlich einfach schreiben. Diese (nicht getestete) Neuimplementierung erfolgt nur durch Lesen des dokumentierten Verhaltens und nicht durch Lesen des Quellcodes von Glibc.quelle
Wenn Sie wissen, dass jede Versionsnummer genau 3 durch Punkte getrennte Ganzzahlen enthält, können Sie sie analysieren (z. B. mit
sscanf(3)
) und vergleichen:quelle
Um die Version schnell zu überprüfen, können Sie Folgendes verwenden
Hoffe es könnte hilfreich sein.
quelle
Hier ist eine rekursive Funktion, die mit mehreren Versionsformatierungen beliebiger Länge arbeitet. Es funktioniert auch für @ "1.0" und @ "1.0.0"
Testmuster:
quelle