Clasificación de NSArray en dos propiedades: int y date

nota de N00B tierra de nuevo. He leído mucho sobre la clasificación de matrices: quería probar el método de bloque, pero no lo he entendido. En cambio, opté por el método de los descriptores. Leo esto Ordenar NSArray de objetos personalizados por sus propiedades NSDate y este ¿Cómo ordenar un NSMutableArray con objetos personalizados en él? entre montones y montones de otros. En mi código hice esto:

NSString *lastHighScore = @"_highScore";
NSString *dateScoreCreated = @"_dateCreated";
NSSortDescriptor *highScoreDescriptor = [[[NSSortDescriptor alloc]
    initWithKey:lastHighScore                                        
    ascending:NO                                          
    selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];

NSSortDescriptor *dateScoreCreatedDescriptor = [[[NSSortDescriptor alloc]
                                      initWithKey:dateScoreCreated
                                      ascending:NO
    selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *descriptors = [NSArray arrayWithObjects:highScoreDescriptor, 
dateScoreCreatedDescriptor, nil];

NSArray *sortedArray = [[[FlipHighScoreStore sharedStore] allHighScores] sortedArrayUsingDescriptors:descriptors];

Lamentablemente, para empezar, recibo un error: el elemento inicializador no es un elemento en tiempo de compilación. Busqué esto e intenté configurar NSSortDescriptor *highScoreDescriptor = nil pero luego recibo una advertencia que dice que highScoreDescriptor "Falta el especificador de tipo, por defecto es int", que en este caso está bien, pero no está tan bien para el objeto Fecha en el siguiente descriptor. (Resulta que también recibo un error que dice que estoy redefiniendo highSoreDescriptor con un tipo diferente).

Además, ¿hay una lista en alguna parte de los selectores disponibles? dudo que localizedCaseInsensitiveCompare: es lo que quiero usar ya que la primera propiedad "_highScore" es un int y la segunda "_dateCreated" es una fecha. Leí en alguna parte que el valor predeterminado es "comparar", ¿puedo simplemente poner "comparar:"? (Encontré una respuesta, creo: puedo usar (intValue) para el primer descriptor:

selector:@selector(intValue)] autorelease];

Leer más me hace pensar que puedo eliminar la línea de selección por completo para el tipo de fecha. ¿Es eso correcto?

Por último, si digo ascending:NO es lo mismo que descender? Supongo que lo es, pero uno nunca sabe con la programación, ¿verdad?

¿Envuelvo todo este código en su propio método? ¿O puedo (hasta más tarde) simplemente colocarlo en el código donde estoy poniendo la mesa?

Este proyecto no es ARC.

preguntado el 03 de mayo de 12 a las 15:05

1 Respuestas

Para responder a mi propia pregunta, con un poco de ayuda de un amigo, básicamente estaba haciendo dos cosas mal. Primero, estaba escribiendo el código fuera de un método, razón por la cual recibía todos los errores sobre los elementos del inicializador. Supongo que estaba muy cansado cuando estaba agregando esto.

En cuanto a la clasificación real, eliminé la opción del selector de la descripción del descriptor y ¡la clasificación realmente sucedió!

Por último, sí, ascending:NO es igual a descender.

El último bit, tendrá que esperar hasta que esté listo para abordar más refactorización de la aplicación.

contestado el 07 de mayo de 12 a las 23:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.