Pregunta

¿Cuál es NSComparisonResult y NSComparator?

he visto una de las definiciones de tipos, algo así:

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

¿Es diferente de un puntero de función?

Además, ni siquiera puedo adivinar lo que los medios de símbolos ^.

¿Fue útil?

Solución

^ significa una tipo de bloque , similar en concepto a un puntero de función.

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
//          ^                      ^                ^
//   return type of block      type name       arguments

Esto significa que el tipo NSComparator es un bloque que toma en dos objetos de tipo id llamado obj1 y obj2, y devuelve un NSComparisonResult.

Específicamente NSComparator se define en el infraestructura de datos de referencia Tipos .

Y para aprender más sobre bloques C, echa un vistazo a este artículo ADC Programación de bloques Temas .

Ejemplo:

NSComparator compareStuff = ^(id obj1, id obj2) {
   return NSOrderedSame;
};

NSComparisonResult compResult = compareStuff(someObject, someOtherObject);

Otros consejos

La respuesta de Jacob es bueno, sin embargo para responder a la parte de "¿cómo es esto diferente de un puntero de función?":

1) el bloque A es no un puntero de función. Los bloques son toma de Apple sobre cómo hacer las funciones primeros ciudadanos de clase en C / C ++ / Objective-C. Es nuevo a iOS 4.0.

2) ¿Por qué introducir este concepto extraño? Resulta que las funciones de primera clase son útiles en un buen número de escenarios, por ejemplo, la gestión de trozos de trabajo que se puede ejecutar en paralelo, como en Grand Central Dispatch. Más allá de GCD, la teoría es lo suficientemente importante que existan sistemas de software basados ??enteras alrededor de ella. Lisp fue uno de los primero.

3) Usted verá este concepto en muchos otros idiomas, pero con diferentes nombres. Por ejemplo Microsoft .Net tiene lambdas y delegados (sin relación con los delegados de Objective-C), mientras que los nombres más genéricos son probablemente funciones anónimas o funciones de primera clase .

NSComparisonResult comparisionresult;
NSString * alphabet1;
NSString * alphabet2;


// Case 1

alphabet1 = @"a";
alphabet2 = @"A";
comparisionresult = [alphabet1 caseInsensitiveCompare:alphabet2];

if (comparisionresult == NSOrderedSame)
    NSLog(@"a and a are same. And the NSComparisionResult Value is %ld \n\n", comparisionresult);
//Result: a and a are same. And the NSComparisionResult Value is 0

// Case 2
alphabet1 = @"a";
alphabet2 = @"B";
comparisionresult = [alphabet1 caseInsensitiveCompare:alphabet2];

if (comparisionresult == NSOrderedAscending)
    NSLog(@"a is greater than b. And the NSComparisionResult Value is %ld \n\n", comparisionresult);
//Result: a is greater than b. And the NSComparisionResult Value is -1

// Case 3
alphabet1 = @"B";
alphabet2 = @"a";
comparisionresult = [alphabet1 caseInsensitiveCompare:alphabet2];

if (comparisionresult == NSOrderedDescending)
    NSLog(@"b is less than a. And the NSComparisionResult Value is %ld", comparisionresult);

//Result: b is less than a. And the NSComparisionResult Value is 1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top