如何使用通用签名定义块

时间:2015-12-24 03:28:03

标签: ios objective-c

对如何将块传递给方法但没有定义(具体)参数的问题感到困惑。

像那样:

 - (void)someMethodWithBlockAsParam:(generic block)block 

是否有可能与Obj-C

有关

好像我在某个地方看到了这个伎俩,但不记得在哪里。

提前感谢。

3 个答案:

答案 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);