Bu, başka bir şekilde söyleyebildiğim kadarıyla, SO üzerindeki "bir blok türünü kontrol edebilirmiyim" den farklıdır.Amaç-C tipi bir blok kontrol edin?
Bilinmeyen imzanın bir blok nesnesi verildiğinde, çağırmadan önce hangi argümanların kabul edildiğini öğrenebilir miyim?
Sözlüğümdeki nesnelerle ilişkili bir dizi geri dönüşüme sahip olduğum bir durum var. Bu geri bildirimlerin bazılarının farklı bir argüman seti beklemesini istiyorum. Buradaki örnek son derece basitleştirilmiştir, ancak bu noktaya dikkat çeker diye düşünüyorum.
Bir bloğun daha önce yazdığım bir türden olup olmadığını nasıl anlarım?
//MyClass.m
// I start by declare two block types
typedef void (^callbackWithOneParam)(NSString*);
typedef void (^callbackWithTwoParams)(NSString*, NSObject*);
........
// I create a dictionary mapping objects to callback blocks
self.dict = @{
@"name": "Foo",
@"callback": ^(NSString *aString) {
// do stuff with string
}
}, {
@"name": "Bar",
@"callback": ^(NSString *aString, NSObject *anObject) {
// do stuff with string AND object
}
}
.....
// Later, this method is called.
// It looks up the "name" parameter in our dictionary,
// and invokes the associated callback accordingly.
-(void) invokeCallbackForName:(NSString*)name {
// What is the type of the result of this expression?
[self.dict objectForKey: name]
// I want to say: (pseudocode)
thecallback = [self.dict objectForKey: name];
if (thecallback is of type "callbackWithOneParam") {
thecallback(@"some param")
}
else if (thecallback is of type "callbackWithTwoParams") {
thecallback(@"some param", [[NSObject alloc] init]);
}
}
ben cant düşünüyorum. Durumunuzda NSObject ek parametresini bırakıp kullanmazsanız sıfırlayabilirsiniz. – SAKrisT
Bu örnekte, sözlük içindeki tüm bloklar için tutarlı bir imza kullanılması daha çok tercih edilir. Her blok içindeki kod, daha sonra hangi parametrelerin kullanılacağına veya yok sayılacağına bağımsız olarak karar verebilir. Ayrıca, bloğu arayabilmeniz için dönüş değerini "-objectForKey:" yerine blok imzanıza eklemelisiniz. Ayrıca, sözlüğe eklemeden önce her bloğu yığına kopyalamanız gerekir. – Darren
Darren son iki ifadeniz hakkında ayrıntılı bilgi verebilir, teşekkür ederim! –