144 votes

Déclarer un paramètre de méthode de bloc sans utiliser un typedef

Est-il possible de spécifier un paramètre de bloc méthode en Objective-C sans utiliser un typedef ? Ça doit être possible, comme pour les pointeurs de fonction, mais je n'arrive pas à trouver la syntaxe gagnante sans utiliser un typedef intermédiaire :

typedef BOOL (^PredicateBlock_t)(int);
- (void) myMethodTakingPredicate:(PredicateBlock_t)predicate

seule la version ci-dessus compile, toutes les autres échouent :

-  (void) myMethodTakingPredicate:( BOOL(^block)(int) ) predicate
-  (void) myMethodTakingPredicate:BOOL (^predicate)(int)

et je ne me souviens pas des autres combinaisons que j'ai essayées.

239voto

Macmade Points 27414
- ( void )myMethodTakingPredicate: ( BOOL ( ^ )( int ) )predicate

65voto

Voici comment ça se passe, par exemple...

[self smartBlocks:@"Pen" youSmart:^(NSString *response) {
        NSLog(@"Response:%@", response);
    }];

- (void)smartBlocks:(NSString *)yo youSmart:(void (^) (NSString *response))handler {
    if ([yo compare:@"Pen"] == NSOrderedSame) {
        handler(@"Ink");
    }
    if ([yo compare:@"Pencil"] == NSOrderedSame) {
        handler(@"led");
    }
}

20voto

funroll Points 4014

http://fuckingblocksyntax.com

Comme paramètre de la méthode :

- (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName;

9voto

bshirley Points 5561

Un autre exemple (ce numéro bénéficie de plusieurs) :

@implementation CallbackAsyncClass {
void (^_loginCallback) (NSDictionary *response);
}
// …

- (void)loginWithCallback:(void (^) (NSDictionary *response))handler {
    // Do something async / call URL
    _loginCallback = Block_copy(handler);
    // response will come to the following method (how is left to the reader) …
}

- (void)parseLoginResponse {
    // Receive and parse response, then make callback

   _loginCallback(response);
   Block_release(_loginCallback);
   _loginCallback = nil;
}

// this is how we make the call:
[instanceOfCallbackAsyncClass loginWithCallback:^(NSDictionary *response) {
   // respond to result
}];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X