在不使用typedef的情况下声明块方法参数


146

是否可以在不使用typedef的情况下在Objective-C中指定方法块参数?它必须像函数指针一样,但是如果不使用中间的typedef,我将无法胜出。

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

仅上述编译,所有这些都将失败:

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

而且我不记得我尝试了哪些其他组合。


Answers:


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

9
+1,尽管typedef对于更复杂的情况确实应该首选a 。
Fred Foo

3
- ( void )myMethodTakingPredicate: ( BOOL ( ^ )( NSString *name, NSString *age ) )predicate { //How Should I Access name & age here...? }
Mohammad Abdurraafay 2011年

6
这些只是参数名称。只需使用它们。
Macmade 2011年

1
@larsmans我同意,除非在很多地方使用特定的谓词/块(如果使用typedef会更清楚)。苹果公司已经定义了许多非常简单的模块,但是这样做的目的是很容易在文档中找到他们想要的。
mtmurdock 2012年

2
强烈推荐!命名您的变量。它们将自动完成为可用代码。因此,请替换BOOL ( ^ )( int )BOOL ( ^ )( int count )
funroll

65

就是这样,例如...

[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");
    }
}

您不使用[NSString isEqualToString:]方法是否有原因?
orkoden 2013年

2
没什么特别的。我只是经常使用“比较:”。不过,“ [NSString isEqualToString:]”是一种更好的方法。
Mohammad Abdurraafay 2013年

你所需要的单词responsesmartBlocks方法定义?你不能说(NSString*))handler {吗?
灰烬》,

你可能有(NSString *)) handler。那也是有效的。
Mohammad Abdurraafay'9


9

另一个示例(此问题得益于多个):

@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
}];

2

更加清晰!

[self sumOfX:5 withY:6 willGiveYou:^(NSInteger sum) {
    NSLog(@"Sum would be %d", sum);
}];

- (void) sumOfX:(NSInteger)x withY:(NSInteger)y willGiveYou:(void (^) (NSInteger sum)) handler {
    handler((x + y));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.