Wenn Sie nur ein Array von NSNumbers
sortieren, können Sie sie mit einem Aufruf sortieren:
[arrayToSort sortUsingSelector: @selector(compare:)];
Dies funktioniert, weil die Objekte im Array ( NSNumber
Objekte) die Vergleichsmethode implementieren. Sie können dasselbe für NSString
Objekte oder sogar für ein Array von benutzerdefinierten Datenobjekten tun , die eine Vergleichsmethode implementieren.
Hier ist ein Beispielcode mit Komparatorblöcken. Es 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 geht durch die Arbeit, einen ganzzahligen Wert für jeden Sortierschlüssel zu erhalten und diese zu vergleichen, um zu veranschaulichen, wie dies zu tun ist. 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 herunterdestilliert werden:
return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];
Ich bevorzuge eher einfache Anweisungen und viele temporäre Variablen, da der Code leichter zu lesen und leichter zu debuggen ist. Der Compiler optimiert die temporären Variablen ohnehin, sodass die All-in-One-Line-Version keinen Vorteil bietet.