Se você estiver apenas classificando uma matriz de NSNumbers
, poderá classificá-las com uma chamada:
[arrayToSort sortUsingSelector: @selector(compare:)];
Isso funciona porque os objetos na matriz ( NSNumber
objetos) implementam o método compare. Você pode fazer o mesmo por NSString
objetos ou mesmo por uma matriz de objetos de dados personalizados que implementam um método de comparação.
Aqui está um exemplo de código usando blocos comparadores. Ele classifica uma matriz de dicionários em que cada dicionário inclui um número na chave "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;
}];
O código acima passa pelo trabalho de obter um valor inteiro para cada chave de classificação e compará-los, como uma ilustração de como fazê-lo. Como os NSNumber
objetos implementam um método de comparação, ele pode ser reescrito de maneira muito mais simples:
#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];
}];
ou o corpo do comparador pode até ser destilado até uma linha:
return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];
Costumo preferir declarações simples e muitas variáveis temporárias porque o código é mais fácil de ler e mais fácil de depurar. O compilador otimiza as variáveis temporárias de qualquer maneira, portanto, não há vantagem na versão all-in-one-line.