Objective-C Выполнить в то время как заявление для NSString - PullRequest
0 голосов
/ 01 января 2012

Итак, я собираю NSString из того, что будет параметрами функции while, которую я пытаюсь запустить ... Я попытаюсь уточнить. Я использую код:

NSMutableString *str = [[NSMutableString alloc] init];
for (int i = 0; i < [self.badCoords count]; i++) {
    CGFloat off = [[self.badCoords objectAtIndex:i] floatValue];
    [str appendFormat:@"(y > %.0f || y < %.0f) && ", off+21, off-21];
}
str = [str substringToIndex:[str length]-4];

, чтобы дать мне строку вывода (y > 102 || y < 60) && (y > 134 || y < 92) && (y > 116 || y < 74) или что-то подобное.

Затем мне нужно поместить эту строку в оператор while, подобный следующему:

while((y > 102 || y < 60) && (y > 134 || y < 92) && (y > 116 || y < 74)) {
    y = [self somethingNew];
}

Ответы [ 4 ]

3 голосов
/ 01 января 2012

Что вы фактически спрашиваете: «Как мне динамически сгенерировать код, скомпилировать его и выполнить?»

И ответ таков; "Ты не". По крайней мере, вы не выходите за рамки особых обстоятельств и, если вы это делаете, вы этого не делаете и ожидаете какой-либо разумной производительности.

В этом случае, похоже, у вас есть числовое представление любых значений, которые вам нужно проверить. Лучше оставить их как числа! Печать в строку, а затем попытка разобрать / скомпилировать ее обратно - это ледяная медленная схема (см. TCL до 2000 года).

т.е. Вы бы вычислили свои различные лимиты, а затем напрямую использовали оператор while ().

while((y > upperLimit) || (y < lowerLimit) ... etc ...) {...}
1 голос
/ 01 января 2012

DDMathParser может сделать то, что вы ищете. https://github.com/davedelong/DDMathParser

1 голос
/ 01 января 2012

Что-то вроде этого должно делать то, что вы просите:

float y = initialYValue;
BOOL yInBadRanges = NO;
while (!yInBadRanges) {
    for (NSNumber *coordinate in self.badCoords) {
        CGFloat upperLimit = [coordinate floatValue]+21.0f;
        CGFloat lowerLimit = [coordinate floatValue]-21.0f;
        if (y <= upperLimit && y >= lowerLimit) {
            yInBadRanges = YES
            break;
        }
    }
    if (!yInBadRanges) y = [self somethingNew];
}

Обратите внимание, что то, как вы изначально просили об этом, не то, как я это сделал. Нет смысла преобразовывать условные выражения в форматированную строку, как вы делаете, потому что вы не можете использовать строку в качестве условного выражения в цикле while таким образом.

Ваш комментарий немного проясняет ваши намерения, но без подробностей сложно предложить конкретный курс действий. Мой совет - хорошо подумать о том, как сделать то, что вы пытаетесь достичь, не задаваясь каким-то конкретным способом сделать это с самого начала. Там может быть лучший алгоритм для размещения элементов управления ...

(применяется стандартный отказ от ответственности: я набрал это в редакторе ответов, не запуская его ...)

0 голосов
/ 01 января 2012

Вы можете выполнить несколько логических тестов (определенных во время выполнения), используя функцию класса NSPredicate.Посмотрите на это, это может быть то, что вам нужно.

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