是否可以(如果可以,如何)将块的 return 值分配给变量?

Is it possible (and if so, how) to assign the return value of a block to a variable?

是否可以将块的 return 值分配给变量?

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

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

NSString *string = sampleBlock();

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

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

我一直在浏览几个解释块语法的站点,例如 fuckingblocksyntax.com,但没有考虑到这种情况。 我知道它可以通过很多方式完成,我只是想要那种方式,以便于阅读。

有谁知道这是否真的可行?

谢谢

当然可以,但是您必须在末尾添加 () 来实际执行该块。否则实际上没有任何可以分配的 return 值。

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

NSLog(@"%@", string);

正确输出

sampleString

这样看。您分配给的变量存在现在:

NSString *string = // ...

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

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

因此,您正在尝试取一个等号,并在左侧将现在存在的存储与右侧的 运行 代码合并十分钟后或一年后的代码,或者永远不会。

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

的年龄时,要求见你的儿子

另一方面,如果您按照其他答案中的建议进行操作,即定义块 并执行它,那么 both 执行 分配现在发生。该块只是我们在生成要分配给变量的字符串的过程中经过的东西。这允许您通过几行内联代码来初始化一个变量。例如在Swift中,函数是first-class公民,这样的成语极为常见:

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

而Swift甚至有一个叫做惰性初始化的特性,它允许函数的执行和变量的初始化被推迟到这样的时间,如果任何,当某些代码实际上 询问 变量的值时:

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