在Objective-C 2.0中有类似Matlab的eval语句吗?

时间:2009-07-12 20:45:57

标签: iphone objective-c

我是Objective-C的新手,我正在寻找像我在Matlab中使用过的eval语句。

如果您对此不熟悉,可以构建一个字符串,然后eval该字符串,将其视为一行代码。

下面是一个示例,您可以根据变量foo = 3更改一系列4个按钮之一的背景颜色,并将按钮命名为button1,button2等。

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

是否有一个声明会将此字符串评估为一行代码?

4 个答案:

答案 0 :(得分:14)

这不是compiled languages中的常见功能,Objective C符合条件。这是因为将源代码转换为CPU可以运行的东西所需的机制和“智能”包含在编译器中,当代码运行时,它不再存在。

答案 1 :(得分:8)

Objective-C 2.0本身没有eval声明;然而;还有一些替代路径可供您使用。

在这种特殊情况下,您很可能需要调用和迭代;正如Perspx所暗示的那样。

在更一般的情况下;调用是从选择器创建的,选择器可以从字符串创建;尽管Objective-C是一种编译语言,但是只要它们被赋予了名称,它们就可以被跟踪,并且因此,它们可以被跟踪。创建一个eval- 之类函数是非常有可能的。

答案 2 :(得分: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];

答案 3 :(得分:0)

哦,keep it Short and Simple:只需使用一个开关,一个if / then子句或一组按钮。

无论如何,如果你想要一些与Objective-C中的eval语句相关的非常酷的东西,请查看code injection

(开玩笑);)