具有返回类型的内联块

时间:2014-05-11 19:30:02

标签: objective-c objective-c-blocks

在Objective-C中是否可以创建内联块并使用其返回类型?例如,我可以创建一个返回BOOL的块,使其内联,并使用其返回类型进行赋值。

BOOL b = <inline block that returns BOOL> { // unsure of the syntax / legality of this
    return YES; // will be more logic in here, that is why I want to use a block.
};

我遇到块语法问题,不确定是否可以内联创建块。我检查了以下资源但没有用。

感谢您的时间和耐心,如果这不可能或非常容易。

4 个答案:

答案 0 :(得分:6)

实现该结果的另一种方法是"compound statement expression"

BOOL b = ({
    BOOL result;
    // other local variables and stuff, computing "result"
    result; // The last expression is the value of this compound statement expression. 
});

这是C语言的GCC扩展(并且也被Clang理解)。它看起来 类似到一个块,但是有些不同。

答案 1 :(得分:3)

您需要做什么使用以下内容:

BOOL b = ^(){ return YES; }();

这实际上创建了块然后调用它。虽然阅读起来并不好,所以你也可以这样做:

BOOL b = NO;
{
    // Other stuff, will be local
    b = YES;
}

答案 2 :(得分:1)

我真的没有看到这个的好理由,但你确实可以做到。只需在块

之后调用函数调用括号
BOOL b = ^{
    return YES;
}();

这与单独声明和使用它,然后内联它完全相同。

BOOL (^returnB)() = ^{
    return YES;
};
BOOL b = returnB();

答案 3 :(得分:1)

不需要创建阻止来执行此操作。如果你没有将Block本身分配给变量以便以后重用,那么它就没有意义了。只需进行必要的计算并将结果放入b

BOOL b = ^BOOL(NSString * s, int n){
    unichar c = [s characterAtIndex:n];
    return c == "w";
}(myString, 5);

应该只是

unichar c = [myString characterAtIndex:5];
BOOL b = c == "w";

如果您因某种原因而担心范围界定,请使用复合语句(将行括在大括号中)或statement expression