Есть ли что-то похожее на eval-выражение Matlab в Objective-C 2.0? - PullRequest
4 голосов
/ 13 июля 2009

Я новичок в Objective-C и ищу выражение eval, которое я использовал в Matlab.

Если вы не знакомы с этим, вы можете создать строку символов, а затем eval эту строку, которая обрабатывает ее, как будто это строка кода.

Вот пример, где вы хотите изменить цвет фона одной из серии из 4 кнопок на основе переменной foo = 3, и ваши кнопки будут называться button1, button2 и т.д.

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

Есть ли оператор, который оценит эту строку, как если бы она была строкой кода?

Ответы [ 4 ]

14 голосов
/ 13 июля 2009

Это не распространенная особенность в скомпилированных языках , к которым Objective C относится. Это связано с тем, что механизмы и «интеллект», необходимые для преобразования исходного кода во что-то, что может запускать процессор, содержатся в компиляторе, которого больше нет при запуске кода.

8 голосов
/ 13 июля 2009

В Objective-C 2.0 само по себе нет eval-выражения; тем не мение; Вам доступно несколько альтернативных путей.

В этом конкретном случае вы, скорее всего, захотите вызов и итерацию; на что ссылается Perspx.

В более общем случае; вызовы создаются из селекторов, а селекторы могут создаваться из строк; объекты могут, если им дано имя, отслеживаться и как таковые, несмотря на то, что Objective-C является компилируемым языком; создание функции eval- like вполне возможно.

6 голосов
/ 13 июля 2009

Нет; хотя 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];
0 голосов
/ 13 июля 2009

Ну что ж, оставь его коротким и простым : просто используйте переключатель, условие if / then или массив кнопок.

В любом случае, если вы хотите что-то действительно классное, связанное с инструкциями eval в Objective-C, взгляните на внедрение кода .

(шучу);)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...