views:

505

answers:

4

I am new to Objective-C and I am looking for an eval statement like I have used in Matlab.

If you are not familiar with this, you can build a character string and then eval that string, which treats it like it is a line of code.

Here is a example where you would want to change the background color of one of a series of 4 buttons based on a variable foo which = 3 and you buttons would be named button1, button2 etc.

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

Is there a statement the will evaluate this string as if it was a line of code?

+12  A: 

This is not a common feature in compiled languages, which Objective C qualifies as. This is because the mechanisms and "intelligence" needed to convert source code into something the CPU can run is contained in the compiler, which is no longer around when the code runs.

unwind
+5  A: 

No; although Objective-C is a dynamically typed language, it is still a compiled language, and not an interpreted one, unlike a language such as Javascript or PHP, for example.

For the above example, you could use an array to store pointers to your UIButton instances:

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

And later retrieve a pointer to the UIButton that you want to call the method on.

[[buttonArray objectAtIndex:foo] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
Perspx
+7  A: 

There is no eval statement in Objective-C 2.0 per se; however; there are a few alternate paths open to you.

In this particular case, you most likely want an invocation and an iteration; as alluded to by Perspx.

In the more general case; invocations are created from selectors, and selectors can be created from strings; objects can, so long as they are given a name, be kept track of, and as such, in spite of Objective-C being a compiled language; creating an eval-like function is quite possible.

Williham Totland
A: 

Oh well, keep it Short and Simple: just use a switch, an if/then clause or an array of buttons.

Anyway, if you want something really cool related to eval statements in Objective-C have a look to code injection.

(just kidding) ;)

IlDan