2011-12-30 44 views
11

Bir blok olarak argüman olarak alan bir blok tanımlamaya çalışıyorum.Bir blogu argüman olarak başka bir bloğa geçirme Objective C

Aşağıdaki kod satırında sorun nedir?

id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^)(void)block) { 
    NSObject *item = nil; 
    block(); 
    return item; 
}; 

Neden derleyici Parameter name omitted ve Expected ")" gibi hatalar veriyor duruyor?

cevap

10
id (^cacheResult)(NSString *, id(^)(void)) = ^(NSString *name, id(^block)(void)) { 
    NSObject *item = nil; 
    block(); 
    return item; 
}; 

Bloklar, işlev işaretçilerine benzer sözdizimine sahiptir.^

3

Muhtemelen atamanın RHS'sinde id(^block)(void) mu demek istediniz?

10

'dan sonra blok adını bildirmeniz gerekir. Bu nedenle, typedef icat edildi. Fonksiyon işaretçilerinin gömülmesi veya bunun gibi blok türleri bir acıdır. Bunu deneyin:

typedef id (^ InnerBlock)(void); 
typedef id (^ OuterBlock)(NSString *, InnerBlock); 

Blok türleri ile çalışmak çok daha kolay okunacak.

+0

ah, işaretçi için teşekkürler (hayır amaçlanan). Bazen okunması zor olan blok tanımlarını buldum ve typedef gerçekten mükemmel bir çözüm! Özel hatam, blok değişken ismini nereye yerleştireceğimi yanlış anlamamıza rağmen. – Tony

İlgili konular