NSComparisonResult und NSComparator - was sind sie?
-
29-09-2019 - |
Frage
Was ist NSComparisonResult
und NSComparator
?
Ich habe eine der Typdefinitionen gesehen, etwas wie folgt aus:
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
Ist es anders aus einem Funktionszeiger?
Auch ich kann nicht einmal erraten, was die ^
Symbol bedeutet.
Lösung
^
bedeutet ein Blocktyp , ähnlich dem Konzept auf einen Funktionszeiger.
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
// ^ ^ ^
// return type of block type name arguments
Das bedeutet, dass der Typ NSComparator
ist ein Block , die id
genannt obj1
und obj2
und kehrt ein NSComparisonResult
.
NSComparator
Insbesondere ist in der Foundation Datentypen Referenz .
Und mehr über C-Blöcke zu lernen, diese ADC Artikel überprüfen Blöcke Programmier Themen .
Beispiel:
NSComparator compareStuff = ^(id obj1, id obj2) {
return NSOrderedSame;
};
NSComparisonResult compResult = compareStuff(someObject, someOtherObject);
Andere Tipps
Jacob Antwort ist gut, aber das Teil zu beantworten, „wie ist das anders als ein Funktionszeiger?“:
1) Ein Block ist nicht ein Funktionszeiger. Die Blöcke sind Apples nehmen auf, wie Funktionen Bürger erster Klasse in C / C ++ / Objective-C zu machen. Es ist neu in iOS 4.0.
2) Warum dieses seltsame Konzept vorstellen? Stellt sich heraus, First-Class-Funktionen sind nützlich, in ganz wenigen Szenarien, zum Beispiel Stücke von Arbeit Verwaltung, die parallel ausgeführt werden können, wie in Grand Central Dispatch. Darüber hinaus GCD ist die Theorie wichtig genug, dass es um ihn herum gesamte Softwaresysteme basieren. Lisp war einer der ersten.
3) Sie dieses Konzept in vielen anderen Sprachen sehen, aber mit unterschiedlichen Namen. Zum Beispiel Microsoft .Net hat lambdas und Delegierten (in keinen Zusammenhang mit Objective-C Delegierten), während die meisten generischen Namen wahrscheinlich anonyme Funktionen oder First-Class-Funktionen .
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