是否有可能(如果是这样,如何)将块的返回值赋给变量?

时间:2015-11-24 17:01:24

标签: objective-c objective-c-blocks

是否可以将块的返回值赋给变量?

例如,我知道可以这样做:

NSString *(^sampleBlock)(void) = ^NSString *(void)
{
    return @"sampleString";
};

NSString *string = sampleBlock();

但我想实现类似的东西(以下语法不正确):

NSString *string = ^NSString *(void)
{
    return @"sampleString";
};

我一直在浏览几个解释块语法的网站,例如fuckingblocksyntax.com,但这种情况并未考虑在内。 我知道它可以通过很多方式完成,我只是想这样做,出于可读性目的。

有人知道这实际上是否可行?

由于

2 个答案:

答案 0 :(得分:5)

当然这是可能的,但你必须在最后添加()来实际执行该块。否则,您无法分配任何返回值。

NSString *string = ^NSString *(void)
{
    return @"sampleString";
}();

NSLog(@"%@", string);

正确输出

  

sampleString

答案 1 :(得分:1)

以这种方式看待它。您要分配的变量存在 now

NSString *string = // ...

但是块只是一个块:它只是一个函数体,一个代码的容器,可能会或可能在将来调用。只要 它(即它包含的代码)将被执行,如果有的话,是完全未知的:

^NSString *(void) {
    return @"sampleString";
}

所以你试图采取一个等号并在左边统一现在存储的存储,右边是从现在起十分钟后的代码运行,或从现在起一年,或从不存在。

这就像科幻电影中某种时间扭曲的悖论。您要求将来运行的代码跳过时间扭曲并在过去返回到此处并将此变量设置为 now 。这就像要求见面,现在,当你的儿子年龄现在时,你的儿子。

另一方面,如果您执行另一个答案中建议的内容,即定义块并执行它,那么两者执行和< / em>现在进行任务。块只是我们在生成要分配给变量的字符串的过程中经过的。这允许您通过内联的几行代码初始化变量。例如,在Swift中,函数是一等公民,这种习惯用法非常普遍:

let s : String = {
    // ... do stuff here
    return result
}()

Swift甚至还有一个名为延迟初始化的功能,它允许执行函数并将变量的初始化推迟到这个时间,如果有的话,当某些代码实际上询问变量的值:

lazy var s : String = {
    // ... do stuff here
    return result
}()