7

¿Qué es NSComparisonResult y NSComparator?NSComparisonResult y NSComparator: ¿qué son?

que 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 qué significa el símbolo ^.

Respuesta

22

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

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

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

Específicamente NSComparator se define en el Foundation Data Types reference.

Y para obtener más información sobre los bloques C, consulte este artículo de ADC Blocks Programming Topics.

Ejemplo:

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

NSComparisonResult compResult = compareStuff(someObject, someOtherObject); 
+0

¡Muchas gracias, Jacob! Ahora encontré tutoriales en Blocks y aprendí un poco más) – wh1t3cat1k

7

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) Un bloque es no una función puntero. Los bloques son la visión de Apple sobre cómo hacer que las funciones sean ciudadanos de primera clase en C/C++/Objective-C. Es nuevo para iOS 4.0.

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

3) 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 first class functions.

-1
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 
Cuestiones relacionadas