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)

私が試した他の組み合わせを思い出せません。


回答:


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された方が明確な多くの場所で使用されている場合を除きます。Appleは、非常に単純なブロックをいくつか定義しましたが、ドキュメントで必要なものを簡単に見つけることができるようにしています。
mtmurdock

2
強くお勧めします!変数に名前を付けます。使用可能なコードにオートコンプリートされます。で置き換えBOOL ( ^ )( int )てくださいBOOL ( ^ )( int count )
funroll 2014

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
特にありません。私は単に「compare:」を使用するために使用しています。'[NSString isEqualToString:]'の方が良い方法です。
Mohammad Abdurraafay 2013年

あなたは言葉が必要ですresponsesmartBlocksメソッド定義?あなたはただ言うことができませんでした(NSString*))handler {か?
2016

あなたが持っているかもしれません(NSString *)) handler。それも有効です。
Mohammad Abdurraafay 2016


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));
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.