2015-11-24 27 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 
}() 
相關問題