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

6
그것들은 단지 매개 변수 이름입니다. 그냥 사용하십시오.
Macmade

1
@larsmans 나는이 특정 술어 / 블록이 typedef'd가 더 명확한 많은 장소에서 사용되지 않는 한 동의한다. Apple은 매우 간단한 여러 블록을 정의했지만 문서에서 원하는 것을 쉽게 찾을 수 있도록했습니다.
mtmurdock 2013

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

2
구체적이지 않습니다. 나는 단지 '비교 :'를 많이 사용합니다. 그래도 '[NSString isEqualToString :]'이 더 좋습니다.
Mohammad Abdurraafay 5

당신은 단어해야합니까 response에서 smartBlocks메소드 정의를? 그냥 말할 수 (NSString*))handler {없습니까?
Ash

있을 수 있습니다 (NSString *)) handler. 이것도 유효합니다.
Mohammad Abdurraafay


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.