Điều này khác với các bài viết khác "Tôi có thể kiểm tra loại khối" trên SO, theo như tôi có thể nói.Loại mục tiêu-C kiểm tra một khối?
Tôi muốn biết nếu được đưa ra một đối tượng khối chữ ký không xác định, tôi có thể tìm hiểu đối số nào nó chấp nhận trước khi gọi?
Tôi có một tình huống mà tôi có một số cuộc gọi lại được liên kết với các đối tượng trong từ điển. Tôi muốn một số trong những callbacks đó mong đợi một bộ đối số khác. Ví dụ ở đây là cực kỳ đơn giản, nhưng tôi nghĩ rằng nó được điểm trên.
Tôi làm cách nào để tìm hiểu xem một khối thuộc loại mà tôi đã nhập trước đó?
//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]);
}
}
Tôi nghĩ rằng bạn không thể. Trong tình huống của bạn, bạn chỉ có thể để lại tham số bổ sung NSObject và đặt nil nếu bạn không sử dụng nó. – SAKrisT
Trong ví dụ này, bạn nên sử dụng chữ ký nhất quán cho tất cả các khối trong từ điển. Mã trong mỗi khối sau đó có thể độc lập quyết định tham số nào sẽ được sử dụng hoặc bỏ qua. Bạn cũng phải truyền giá trị trả về từ '-objectForKey:' vào chữ ký khối của bạn trước khi bạn có thể gọi khối. Bạn cũng phải sao chép từng khối vào heap trước khi thêm nó vào từ điển. – Darren
Darren bạn có thể giải thích về hai câu cuối cùng của mình, cảm ơn bạn! –