2009-07-12 48 views
4

我是Objective-C的新手,我正在尋找像我在Matlab中使用的eval語句。Objective-C 2.0中是否有類似Matlab的eval語句?

如果你不熟悉這個,你可以建立一個字符串,然後eval這個字符串,它把它看作是一行代碼。

這裏是一個例子,其中你想改變基於哪個= 3的可變FOO的一系列4個按鈕中的一個的背景顏色和你的按鈕將被命名爲按鈕1,按鈕2等

NSString* buttonEval = [[NSString alloc] initWithFormat:@"[button%d setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];", foo] 

是否有一個聲明會評估這個字符串,就好像它是一行代碼?

回答

6

否;儘管Objective-C是一種動態類型語言,但它仍然是一種編譯語言,而不是一種解釋語言,例如,與JavaScript或PHP等語言不同。

對於上面的例子,你可以使用一個數組的指針存儲到您的UIButton實例:

buttonArray = [[NSMutableArray alloc] init]; 
... 
UIButton *aButton; //Reference to a UIButton instance 
[buttonArray addObject:aButton]; 

後來檢索指向要調用的方法UIButton

[[buttonArray objectAtIndex:foo] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
14

這不是compiled languages中的常見功能,Objective C符合此條件。這是因爲編譯器中包含了將源代碼轉換爲CPU可以運行的東西所需的機制和「智能」,編譯器在代碼運行時不再存在。

8

Objective-C 2.0本身沒有eval語句;然而;有幾條替代路徑向您開放。

在這種特殊情況下,您很可能需要調用和迭代;正如由Perspx所暗示的那樣。

在更一般的情況下;調用是從選擇器創建的,選擇器可以從字符串創建;對象可以,只要它們被賦予一個名稱,就可以跟蹤,並且同樣,儘管Objective-C是一種編譯語言,創建一個eval- 功能是很有可能的。

0

哦,keep it Short and Simple:只需使用一個開關,一個if/then子句或一組按鈕。

無論如何,如果你想要Objective-C中與eval語句相關的非常酷的東西,請看code injection

(只是在開玩笑);)

相關問題