Wenn Sie nur ein Array von NSNumbers
können Sie sie mit 1 Anruf sortieren:
[arrayToSort sortUsingSelector: @selector(compare:)];
Das funktioniert, weil die Objekte in dem Array ( NSNumber
Objekte) implementieren die Vergleichsmethode. Das Gleiche könnte man für NSString
Objekte oder sogar für ein Array von benutzerdefinierten Datenobjekten, die eine Vergleichsmethode implementieren.
Hier ist ein Beispielcode mit Komparatorblöcken. Er sortiert ein Array von Wörterbüchern, wobei jedes Wörterbuch eine Zahl in einem Schlüssel "sort_key" enthält.
#define SORT_KEY @\"sort_key\"
[anArray sortUsingComparator:
^(id obj1, id obj2)
{
NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue];
NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue];
if (value1 > value2)
{
return (NSComparisonResult)NSOrderedDescending;
}
if (value1 < value2)
{
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
Der obige Code veranschaulicht, wie man einen ganzzahligen Wert für jeden Sortierschlüssel erhält und diese vergleicht. Da NSNumber
Objekte eine Vergleichsmethode implementieren, könnte sie viel einfacher umgeschrieben werden:
#define SORT_KEY @\"sort_key\"
[anArray sortUsingComparator:
^(id obj1, id obj2)
{
NSNumber* key1 = [obj1 objectForKey: SORT_KEY];
NSNumber* key2 = [obj2 objectForKey: SORT_KEY];
return [key1 compare: key2];
}];
oder der Körper des Komparators könnte sogar auf 1 Zeile reduziert werden:
return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];
Ich neige dazu, einfache Anweisungen und viele temporäre Variablen zu bevorzugen, weil der Code leichter zu lesen und einfacher zu debuggen ist. Der Compiler optimiert die temporären Variablen ohnehin weg, so dass die Ein-Zeilen-Version keinen Vorteil bietet.