Jeśli tylko sortujesz tablicę NSNumbers
, możesz sortować je za pomocą 1 połączenia:
[arrayToSort sortUsingSelector: @selector(compare:)];
Działa to, ponieważ obiekty w tablicy ( NSNumber
obiekty) implementują metodę porównywania. To samo możesz zrobić dla NSString
obiektów, a nawet dla tablicy niestandardowych obiektów danych, które implementują metodę porównywania.
Oto przykładowy kod wykorzystujący bloki komparatora. Sortuje tablicę słowników, w których każdy słownik zawiera liczbę w kluczu „sort_key”.
#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;
}];
Powyższy kod przedstawia pracę polegającą na uzyskaniu wartości całkowitej dla każdego klucza sortowania i porównaniu ich, jako ilustracja tego, jak to zrobić. Ponieważ NSNumber
obiekty implementują metodę porównywania, można ją przepisać znacznie prościej:
#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];
}];
lub korpus komparatora może być nawet destylowany do 1 linii:
return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];
Wolę proste instrukcje i wiele zmiennych tymczasowych, ponieważ kod jest łatwiejszy do odczytania i łatwiejszy do debugowania. Kompilator i tak optymalizuje zmienne tymczasowe, więc nie ma przewagi nad wersją „wszystko w jednym wierszu”.