对如何将块传递给方法但没有定义(具体)参数的问题感到困惑。
像那样: - (void)someMethodWithBlockAsParam:(generic block)block
是否有可能与Obj-C
有关好像我在某个地方看到了这个伎俩,但不记得在哪里。
提前感谢。
答案 0 :(得分:4)
您需要声明某些内容,否则该块的调用点不知道要传递什么或者返回什么。特别是,它需要知道它们是否将成为Objective C对象,否则它无法正确地重新计算它们。
如果你只想要一个不带参数的块并且什么都不返回(基本上是回调),那么你可以使用dispatch_block_t
:
- (void)someMethodWithBlockAsParam:(dispatch_block_t)block
答案 1 :(得分:2)
对如何将块传递给方法但没有定义(具体)参数的问题感到困惑。
我不清楚你在这里究竟是什么问题,但听起来你希望能够将任何块传递给一个方法,这个方法可能会在以后某个时候转换为特定的块键入,这样你就可以调用它。如果是这样的话:
现代的一个块(2014年末后 - 请参阅this question and answer了解该日期的原因)ARC Objective-C是一个完全自动管理的对象。因此,标准的“任何对象”类型id
可用于传递任何块。
例如:
// a specific block type
typedef id (^SelectBlock)(NSArray *, NSUInteger);
// method which takes a general object and casts to a specific block type
- (void) useBlock:(id)blockObj
{
SelectBlock sb = (SelectBlock)blockObj;
id item = sb(@[@"apple", @"pear", @"plum"], 2);
NSLog(@"Result: %@", item);
}
// method which pass a block as "any object"
- (void) test:(NSUInteger)offset
{
SelectBlock mySelect = ^(NSArray *collection, NSUInteger index)
{
return collection[index-offset];
};
[self useBlock:(id)mySelect];
}
然后是电话:
[self test:1];
将导致输出pear
。
以这种方式“泛泛地”传递块仅在原始类型以某种方式已知时才有用,因此可以将id
类型值强制转换回正确的块类型以调用块。
答案 2 :(得分:0)
如何使用一个NSDictionary
参数定义一个块,您可以在其中放置任何数字和任何类型的对象作为参数?
typedef void (^aBlock)(NSDictionary* parameters);