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.

War es hilfreich?

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.

in zwei Objekte vom Typ nimmt

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top