7

Was ist NSComparisonResult und NSComparator?NSComparisonResult und NSComparator - was sind sie?

Ich habe eine der Typdefinitionen gesehen, so etwas wie die:

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

Ist es anders aus einem Funktionszeiger?

Auch kann ich nicht einmal erraten, was das Symbol ^ bedeutet.

Antwort

22

^ bezeichnet einen Blocktyp, ähnlich wie ein Funktionszeiger. Diese

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

bedeutet, dass der Typ NSComparator ist ein Block , die in zwei Objekte vom Typ nimmt id genannt obj1 und obj2, und gibt eine NSComparisonResult.

Speziell NSComparator ist in der Foundation Data Types reference definiert.

Weitere Informationen zu C-Blöcken finden Sie in diesem ADC-Artikel Blocks Programming Topics.

Beispiel:

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

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

Vielen Dank Jacob! Jetzt habe ich Tutorials zu Blocks gefunden und ein bisschen mehr gelernt) – wh1t3cat1k

7

Jakobs Antwort ist gut, aber das Teil zu beantworten, „wie diese anders als ein Funktionszeiger ist?“:

1) Ein Block ist nicht eine Funktion Zeiger. Blöcke sind Apples Ansatz, um in C/C++/Objective-C Funktionen für erstklassige Bürger zu machen. Es ist neu für iOS 4.0.

2) Warum dieses seltsame Konzept einführen? Stellt sich heraus, First-Class-Funktionen sind nützlich in einigen Szenarien, zum Beispiel die Verwaltung von Teilen der Arbeit, die parallel ausgeführt werden können, wie in Grand Central Dispatch. Jenseits von GCD ist die Theorie wichtig genug, dass ganze Softwaresysteme darauf basieren. Lisp war einer der ersten.

3) Sie werden dieses Konzept in vielen anderen Sprachen sehen, aber unter verschiedenen Namen. Zum Beispiel hat Microsoft .Net Lambdas und Delegates (keine Beziehung zu Objective-C-Delegaten), während die allgemeinsten Namen wahrscheinlich anonyme Funktionen sind oder 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 
Verwandte Themen