2012-02-11 13 views
12

Todavía soy nuevo en objective-c y estoy tratando de descubrir qué hace exactamente esta afirmación.sortedArrayUsingSelector ¿qué está haciendo?

[names allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

sé que allKeys es conseguir todas las llaves de mi diccionario. Sé que sortedArrayUsingSelector está ordenando mi matriz im creando. Entonces estoy llamando al método de comparación, es donde estoy perdido, ¿qué está haciendo? Del documento en apple se dice que "Devuelve un valor de NSComparisonResult que indica si el receptor es mayor, igual o menor que un número determinado". No entiendo cómo se clasifica según ese método.

Respuesta

22
NSArray * sortedKeys = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

El código anterior devuelve una matriz ordenada de las teclas del diccionario utilizando el selector que proporcione. El selector es realmente la función que se llamará al objeto que se está ordenando en su matriz. En este caso, la matriz contiene cadenas por lo que en el código real NSArray clasificar de la siguiente estaría pasando,

//... 
[key1 compare:key2]; 
//.. 

Si pasa en un selector diferente digamos @selector (randomFunction :) a continuación en el código de clasificación sería la siguiente suceder

//.. 
[key1 randomFunction:key2]; 
//.. 

Dado que NSString no responde al selector randomFunction, se obtendría un error. Si quisiera crear su propio tipo de función de comparación, necesitaría agregar una categoría a la clase que contiene la matriz (en su caso, una categoría de NSString).

Una mejor forma de ordenar una matriz es usar una instrucción de bloque.

id mySort = ^(NSString * key1, NSString * key2){ 
    return [key1 compare:key2]; 
}; 


NSArray * sortedKeys = [[names allKeys] sortedArrayUsingComparator:mySort]; 

La razón por la que es una mejor manera de clasificar cualquier objeto es muy fácil de hacer.

id mySort = ^(MyObject * obj1, MyObject * obj2){ 
    return [obj1.title compare:obj2.title]; 
}; 


NSArray * sortedMyObjects = [myObjects sortedArrayUsingComparator:mySort]; 
+0

+1 - buena explicación – bryanmac

5
- (NSComparisonResult)compare: 
{ 
    // if (value of firstObject) < (value of secondObject) 
     // return NSOrderedAscending 
    // else if (value of firstObject) == (value of secondObject) 
     // return NSOrderedSame 
    // else 
     // return NSOrderedDescending 
} 
0

Probablemente debería utilizar caseInsensitiveCompare: en esta situación, ya que es muy probable que se ordena una matriz de cadenas (teclas de un diccionario).

Supone que sortedArrayUsingSelector está de alguna manera separado de la parte compare: del código. Este no es el caso. compare:es el selector que se utiliza para ordenar la matriz.

El método de clasificación le devuelve una matriz en la que cada elemento, cuando se envía el selector especificado y el siguiente elemento de la matriz, proporciona el orden de clasificación correcto.

Cómo NSArray logra esto no es público, pero en la raíz, el selector que define se utiliza para comparar pares de objetos dentro de la matriz, el resultado de lo cual informa su ubicación en la matriz ordenada.

3

El -sortedArrayUsingSelector: Método en su ejemplo llama al -compare: Método sobre los objetos de la matriz. Para algunos objetos, Apple ya ha implementado un método -compare:, por ejemplo, si lee the NSString documentation, encontrará un método -compare: implementado. También puede llamar a métodos de comparación personalizados en sus propios objetos personalizados si ha implementado un método de comparación en estos objetos. Tenga en cuenta que el método de comparación no tiene que llamarse -compare:, de importancia es solo el valor de retorno (NSComparisonResult) y el objeto que recibe el método.

0

La nueva matriz contiene referencias a los elementos de la matriz de recepción, no copias de ellos.
El mensaje de comparación se envía a cada objeto en la matriz y tiene como único argumento otro objeto en la matriz.
Por ejemplo, una matriz de objetos NSString se puede ordenar utilizando el método caseInsensitiveCompare: declarado en la clase NSString. Suponiendo que existe una matriz, se puede crear una versión ordenada de la matriz de esta manera:

NSArray *sortedArray = 
    [anArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
Cuestiones relacionadas