이것은 내가 말할 수있는 한 "블록의 유형을 확인할 수 있습니까?"와 다른 점입니다.Objective-C 유형을 블록 검사합니까?
알려지지 않은 서명의 블록 객체가 주어지면 호출하기 전에 받아 들여지는 인수를 알 수 있습니까?
사전에있는 개체와 관련된 여러 콜백이있는 상황이 있습니다. 이러한 콜백 중 일부는 다른 인수 집합을 기대합니다. 여기의 예제는 극도로 간소화되었지만 요점을 파악할 수 있다고 생각합니다.
블록이 이전에 typedef 된 유형인지 어떻게 알 수 있습니까?
//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]);
}
}
당신이 캔트 생각합니다. 귀하의 상황에서 NSObject를 추가로 사용하고 사용하지 않으면 nil을 넣을 수 있습니다. – SAKrisT
이 예제에서는 사전 내의 모든 블록에 일관된 서명을 사용하는 것이 훨씬 더 바람직합니다. 그런 다음 각 블록 내의 코드가 사용되거나 무시 될 매개 변수를 독립적으로 결정할 수 있습니다. 또한 블록을 호출하기 전에'-objectForKey :'의 반환 값을 블록 서명으로 형변환해야합니다. 사전에 추가하기 전에 각 블록을 힙에 복사해야합니다. – Darren
대런은 지난 두 문장에 대해 자세히 설명해 주셔서 감사합니다. –