我是Objective-C的新手,我正在寻找像我在Matlab中使用过的eval
语句。
如果您对此不熟悉,可以构建一个字符串,然后eval
该字符串,将其视为一行代码。
下面是一个示例,您可以根据变量foo = 3更改一系列4个按钮之一的背景颜色,并将按钮命名为button1,button2等。
NSString* buttonEval = [[NSString alloc] initWithFormat:@"[button%d setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];", foo]
是否有一个声明会将此字符串评估为一行代码?
答案 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。
(开玩笑);)