Typedef kullanmadan bir blok yöntemi parametresi bildirin


146

Typedef kullanmadan Objective-C'de bir yöntem blok parametresi belirtmek mümkün müdür? İşlev işaretçileri gibi olmalı, ancak bir ara typedef kullanmadan kazanan sözdizimine ulaşamam:

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

sadece yukarıdaki derlemeler, tüm bunlar başarısız:

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

ve başka hangi kombinasyonları denediğimi hatırlayamıyorum.


Yanıtlar:


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

9
+1, ancak typedefdaha karmaşık durumlarda gerçekten a tercih edilmelidir.
Fred Foo

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

6
Bunlar sadece parametre isimleridir. Sadece kullanın.
Macmade

1
@larsmans Kabul ediyorum, bu belirli yüklem / bloğun yazılmasının daha açık olacağı birçok yerde kullanılmadığı sürece. Apple, oldukça basit bir dizi blok tanımladı, ancak bunu, belgelerde istediklerini bulmanın kolay olmasını sağlayacak şekilde yaptı.
mtmurdock

2
Güçlü tavsiye! Değişkenlerinizi adlandırın. Kullanılabilir koda otomatik olarak tamamlanırlar. Yani değiştirmek BOOL ( ^ )( int )ile BOOL ( ^ )( int count ).
2014, 19

65

Mesela böyle gidiyor ...

[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:] yöntemini kullanmamanızın bir nedeni var mı?
orkoden

2
Belirli bir şey yok. Ben sadece "karşılaştır:" seçeneğini çok kullanıyorum. '[NSString isEqualToString:]' daha iyi bir yoldur.
Mohammad Abdurraafay

Eğer kelimeyi mi istiyorsunuz responseiçinde smartBlocksmetod tanımının? Söyleyemez (NSString*))handler {misin?
Ash

Olabilir (NSString *)) handler. Bu da geçerlidir.
Mohammad Abdurraafay


9

Başka bir örnek (bu sorun birden çok noktadan yararlanır):

@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

Daha da net!

[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));
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.