是否可以(如果可以,如何)将块的 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
}()
是否可以将块的 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
}()