Comment puis-je spécifier l'objet bloc / prédicat requis par keysOfEntriesPassingTest de NSDictionary?

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

Question

Pour l'apprentissage (pas pratique - encore) fins, je voudrais utiliser la méthode suivante sur un NSDictionary pour me redonner un jeu de clés qui ont des valeurs à l'aide d'un test que j'ai défini. Malheureusement, avoir aucune idée de la façon de spécifier le prédicat.

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

LET disons par exemple de toutes mes valeurs sont NSURLs, et je voudrais revenir toutes les URL qui sont sur le port 8080. Voici mon coup de couteau à codage qui - me si elle ne fait pas vraiment de sens que « D correctes:

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

Et parce que je reviens l'erreur du compilateur suivant:

  

types de pointeur de bloc incompatible initialisation 'vide (^) (struct objc_object *, struct objc_object * BOOL *)', attendu 'BOOL (^) (struct objc_object *, struct objc_object * BOOL *)'

Qu'est-ce que je manque? J'apprécierais un pointeur à certains documents qui vont plus en détail sur l'objet « Block » que le prédicat est censé être.
Merci!


Et voici le code qui fonctionne:

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

La solution

L'erreur indique que votre bloc doit retourner un BOOL, plutôt que id. Vérifiez la documentation. Je suppose que vous êtes censé revenir YES si la clé / obj paire passe le test désiré.

Autres conseils

Un peu d'expansion sur la réponse Barry ....

Un bloc est comme un pointeur de fonction avec une différence clé. Un bloc va déduire le type de retour des déclarations de retour contenu dans ou il donnera un message d'erreur comme celui que vous avez dit (l'erreur du compilateur LLVM devrait être un peu plus raisonnable).

Quand vous avez écrit:

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

Considérez que en fonction:

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

Voir le problème? Il y a un chemin de code qui ne renvoie pas une valeur et, par conséquent, le compilateur se plaindra.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top