如何实现递归块?

李岡諭*_*李岡諭 8 recursion aop block objective-c

我想声明一个块类型,它采用一个相同块类型的参数.它就是这样的:

typedef void (^BlockInBlock) (BlockInBlock block);
Run Code Online (Sandbox Code Playgroud)

我知道声明无效.但我想知道是否有任何可能的方法来实现递归块,它只采用一个相同块类型的参数.


我正在尝试使用块在Objective-C中找到一种实现面向方面编程(AOP)的方法.以下是关于如何实现这一点的问题.

进一步的问题1:

如何实现一个可变参数函数,它接受我上面描述的许多块并最终结束nil,并且我可以使用多个块调用该函数,直到遇到nil?它会是这样的:

@interface NSObject(AOP)
- (void) invokeBlockInBlock:(BlockInBlock) headBlock, ...{
    va_list blockList;
    va_start(blockList, headBlock);

    // Invoke recursive blocks here until the value of va_arg(blockList, BlockInBlock) is nil
    // it would be like: block1(self, block2(self, block3(self, block4(...))));

    va_end(blockList);
}
@end
Run Code Online (Sandbox Code Playgroud)

进一步的问题2:

如果递归块有返回值怎么办?


关于C语言的其他问题:

是否可以声明一个C函数,它接受一个C函数指针的参数,而C函数指针的函数也需要另一个C函数指针?

hol*_*lex 11

可能与您正在寻找的相似:

typedef void (^Block)(id);
Run Code Online (Sandbox Code Playgroud)

从字面上看,它会导致无限递归循环:

Block _block;
_block = ^(Block block) {
    if (block) block(block);
};

_block(_block);
Run Code Online (Sandbox Code Playgroud)

但是,参数可以是任何id不仅完全相同的参数Block,但它表示如何将同一块作为参数传递给同一块.

所以,这就是主意.

  • 有趣的是,每个人在发布这些例子时都会进行无限递归...... :) (3认同)