2015-11-24 26 views
2

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

例如,我知道这是可以做到:

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

NSString *string = sampleBlock(); 

但我想实现像(以下语法不正确):

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

我一直在寻找通过几个解释块语法的网站,比如fuckingblocksyntax.com,但这种情况没有解决。 我知道它可以在很多方面完成,我只是想这样,为了可读性的目的。

有谁知道这是否可能?

感谢

+1

什么的这点?为什么你不能''NSString * string = @“sampleString”;'?尝试使用这样的内联块有什么好处?也许一个真实的例子会更好。 – rmaddy

+1

这是什么意思?我已经说过,可读性的目的。 当然,按照你的建议做起来会更容易,但这就是为什么“样品”到位的原因...... – inigo333

回答

5

当然这是可能的,但你必须真正通过在结尾处增加()执行块。否则,没有任何可以分配的返回值。

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

NSLog(@"%@", string); 

正确输出

sampleString

+0

哦!当然。谢谢! – inigo333

1

看它这样。到你指定的变量现在存在

NSString *string = // ... 

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

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

所以,你试图把一个等号,凝聚,在左边,现在存在存储在右边,从现在开始,或者从现在开始的十年内,或者从未开始的十分钟内运行代码。

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


在另一方面,如果你做了什么建议在对方的回答,即定义块并执行它,然后执行分配现在发生。该块只是我们在生成要分配给变量的字符串的过程中传递的内容。这允许你通过内联的几行代码初始化一个变量。在夫特,例如,其中函数是一等公民,这种习惯用法是极为普遍的:

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

和迅速甚至有一个称为延迟初始化特征,这允许功能和初始化的执行变量要推迟到这样的时候,如果有的话,当一些代码实际上要求为变量的值:

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