williamsandonz
williamsandonz

Reputation: 16420

Objective-c Workaround for running intepretted code

I'm used to using eval() in languages like javascript e.t.c.

In cocos2d, to select the level, I am passing "1" or "2" to my Loadlevel.m file, the level Classes are named "LevelOne" and "LevelTwo" accordingly, I wanted to create a dictionary lookup that paried "1" => "LevelOne" e.t.c then run eval on that string to effectively call [MyLevel node];

Apparently we can't use eval in IOS code, so how would I go about doing this?

Upvotes: 0

Views: 91

Answers (2)

jscs
jscs

Reputation: 64002

I'm not one hundred percent clear on what you're asking, but you can store class objects directly in your dictionary, retrieve them, and send them messages:

NSDictionary * d = [NSDictionary dictionaryWithObjectsAndKeys:[LevelOne class], @"1", [LevelTwo class], @"2", nil];

Class selectedLevel = [d objectForKey:@"1"];

[selectedLevel node];

Upvotes: 1

Adam Leonard
Adam Leonard

Reputation: 489

Try using the NSStringFromClass and NSClassFromString functions.

Specifically, represent the classes as strings in your dictionary, e.g.,

[myDictionary setObject:NSStringFromClass([LevelOne class]) forKey:@"1"]

Then, to use the right level from your dictionary, you could do:

NSString *levelAsString = [myDictionary objectForKey:@"1"];
id node = [NSClassFromString(levelAsString) node]

(I'm assuming +node is a class method)

Now, this is a pretty uncommon and odd design in Cocoa. Perhaps if you explain more about what you're doing, we could suggest alternate design choices that might be better.

Upvotes: 1

Related Questions