2014-01-10 53 views
3

意外或多或少我偶然發現了這種形式的作用域這種形式的範圍界定是如何被調用的?

DataSource *dataSource =({ 
    NSInteger idx = [[self.tableView indexPathForSelectedRow] row]; 
    DataSource *dataSource = [DataSource new]; 
    dataSource.address = self.destinations[idx][0]; 
    dataSource.name = self.destinations[idx][1]; 
    dataSource; 
}); 

的,我認爲它是創建和實例化對象和變量作爲臨時變量,只要他們需要創建將只活的好方法我真的需要和關心的對象。在上面的代碼中,idx將在我將內部dataSource寫入外部dataSource時消失,因爲範圍將在不久之後離開。
另外我發現這樣一個事實,即完全實例化和配置的對象將設置爲外部對象。
實際上,我甚至不知道這是一個C或Objective-C功能還是添加到clang的語法糖果。


@Unheilig
這是組織代碼語法。它不是像塊或封閉的東西。在代碼的最後,你只需要一個完全實例化和配置好的對象。

如果您只需要一個對象將其作爲參數傳遞給某個方法,但這個對象的配置需要多個語句,則這很方便。您可以傳遞一個語句表達式,而不是將其分配給本地臨時變量。

[[MYViewController alloc] initWithDataSource:({ 
    NSInteger idx = [[self.tableView indexPathForSelectedRow] row]; 
    DataSource *dataSource = [DataSource new]; 
    dataSource.address = self.destinations[idx][@"address"]; 
    dataSource.name = self.destinations[idx][@"name"]; 
    dataSource; 
})]; 

在非ARC環境中,您甚至可以在表達式語句中調用autorelease。

所以它只是代碼組織和我猜想的很多個人品味。

+0

我希望迄今爲止它對你有效。你能舉出一個可能有用的場景嗎?你會如何調用/調用它?提前致謝。 – Unheilig

+0

@Unheilig,看我的編輯 – vikingosegundo

+0

+1。欣賞它。謝謝。 – Unheilig

回答

9

這是一個GCC擴展,稱爲「語句表達式」,在http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html中描述。

+1

如果鏈接被破壞,您應該真的將該網址的相關部分添加到您的答案中。 –

+0

@CodeMaverick:答案是IMO。我問這個名字,格溫達爾給了它。另外他還說這是一個GCC擴展。這是一個完美的答案。 – vikingosegundo