Wie lege ich das Blockobjekt / Prädikat erforderlich durch NSDictionary des keysOfEntriesPassingTest?

StackOverflow https://stackoverflow.com/questions/3034251

Frage

(nicht praktisch - noch) zu Lernzwecken, würde Ich mag die folgende Methode auf einem NSDictionary verwenden, um mir eine Reihe von Schlüsseln zurück, die Werte mit einem Test habe ich festgelegt haben. Leider keine Ahnung, wie das Prädikat angeben.

NSDictionary keysOfEntriesPassingTest:
- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate

Lassen Sie uns zum Beispiel sagen, alle meine Werte sind NSURLs, und ich möchte alle URLs zurück, die auf Port sind 8080 Hier ist mein Stich an Codierung, dass - obwohl sie nicht wirklich Sinn für mich, dass es Würd korrekt:

NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
                 if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
                     return key;
                 }]

Und das ist, weil ich die folgenden Compiler-Fehler zurück:

  

inkompatiblen Blockzeigertypen Initialisieren 'void (^) (struct objc_object *, struct objc_object *, BOOL *)', erwartete 'BOOL (^) (struct objc_object *, struct objc_object *, BOOL *)'

Was bin ich? Ich würde einen Zeiger auf einige Dokumente zu schätzen wissen, die mehr ins Detail über die „Block-Objekt“ gehen, dass das Prädikat sein soll.
Dank!


Und das ist der Code, das funktioniert:

NSSet *mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
{
  if ([[obj port] isEqual:[NSNumber numberWithInt: 8080]])
     return YES;
   else
     return NO;
}];
War es hilfreich?

Lösung

Der Fehler zeigt an, dass Block eine BOOL zurückgeben muss, anstatt id. Überprüfen Sie die Dokumentation. Ich vermute, Sie werden voraussichtlich YES zurück, wenn der Schlüssel / obj Paar den gewünschten Test besteht.

Andere Tipps

Eine kleine Erweiterung auf Barrys Antwort ....

Ein Block ist wie ein Funktionszeiger mit einem wesentlichen Unterschied. Ein Block wird den Rückgabetyp der return-Anweisungen enthalten sind innerhalb von oder es gibt eine Fehlermeldung wie die, die Sie sagte schließen (die LLVM Compiler Fehler sollte ein bisschen mehr sinnvoll sein).

Wenn Sie schreibt:

NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
                 if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
                     return key;
                 }]

Beachten Sie, dass als Funktion:

BOOL bob(id key, id obj) {
    if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
        return key;
    }
}

Sehen Sie das Problem? Es gibt einen Codepfad, der keinen Wert und damit zurückkehrt, würde der Compiler beschweren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top