To różni się od innych wpisów "Czy mogę sprawdzić typ bloku" na SO, o ile mogę powiedzieć.Objective-C - sprawdź blok?
Chcę wiedzieć, czy, biorąc pod uwagę obiekt blokowy o nieznanym sygnaturze, mogę się dowiedzieć, jakie argumenty akceptuje przed wywołaniem?
Mam sytuację, w której mam wiele wywołań zwrotnych związanych z obiektami w słowniku. Chcę, żeby niektóre z tych wywołań oczekiwały innego zestawu argumentów. Przykład tutaj jest niezwykle uproszczony, ale myślę, że ma to rację.
Jak mogę się dowiedzieć, czy blok jest typu, który wcześniej wpisałem?
//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]);
}
}
myślę, że mogę. W twojej sytuacji możesz po prostu zostawić dodatkowy parametr NSObject i wstawić zero, jeśli go nie używasz. – SAKrisT
W tym przykładzie znacznie korzystniej jest użyć spójnego podpisu dla wszystkich bloków w słowniku. Kod w każdym bloku może następnie niezależnie decydować, które parametry będą używane lub ignorowane. Musisz również przesłać wartość zwracaną z '-objectForKey:' do swojej sygnatury bloku, zanim będziesz mógł wywołać blok. Musisz także skopiować każdy blok do sterty przed dodaniem go do słownika. – Darren
Darren, mógłbyś rozwinąć swoje ostatnie dwa stwierdzenia, dziękuję! –