7

Che cosa sono NSComparisonResult e NSComparator?NSComparisonResult e NSComparator - cosa sono?

Ho visto una delle definizioni di tipo, qualcosa di simile:

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

E 'diverso da un puntatore a funzione?

Inoltre, non riesco nemmeno a immaginare che cosa significa il simbolo ^.

risposta

22

^ significa un tipo blocco, concettualmente simile ad un puntatore a funzione.

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

Ciò significa che il tipo NSComparator è un blocco che prende in due oggetti di tipo id chiamato obj1 e obj2, e restituisce un NSComparisonResult.

In particolare NSComparator è definito nello Foundation Data Types reference.

E per saperne di più su blocchi C, consulta questo articolo ADC Blocks Programming Topics.

Esempio:

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

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

Grazie mille, Jacob! Ora ho trovato tutorial su Blocks e ho imparato un po 'di più) – wh1t3cat1k

7

risposta di Jacob è buona, tuttavia per rispondere alla parte di "come è questo diverso da un puntatore a funzione?":

1) Un blocco è non una funzione puntatore. I blocchi sono i suggerimenti di Apple su come rendere le funzioni di cittadini di prima classe in C/C++/Objective-C. È nuovo per iOS 4.0.

2) Perché introdurre questo strano concetto? Risulta che le funzioni di prima classe sono utili in diversi scenari, ad esempio gestendo blocchi di lavoro che possono essere eseguiti in parallelo, come in Grand Central Dispatch. Al di là di GCD, la teoria è abbastanza importante che ci sono interi sistemi software basati su di esso. Lisp è stato uno dei primi.

3) Si vedrà questo concetto in molte altre lingue, ma con nomi diversi. Ad esempio, Microsoft .Net ha lambdas e delegati (nessuna relazione con i delegati Objective-C), mentre i nomi più generici sono probabilmente funzioni anonime 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