Интерполяция строк в стиле Ruby с помощью iOS NSRegularExpression - PullRequest
1 голос
/ 15 декабря 2011

Я пытаюсь сгенерировать HTML-вывод для модели в моем приложении. Это будет эффективно проходить и заполнять различные места в файле HTML соответствующими значениями в модели. Изначально я просто собирался взять шаблон HTML как отформатированную строку, но если что-то изменится позже в макете или что-то в этом роде, это станет очень грязным и утомительным, чтобы привести порядок значений в порядок, в котором они появляются в шаблоне. .

Вместо этого я пытаюсь выполнить своего рода интерполяцию строки в стиле Ruby. Везде, где я хочу получить значение из модели, я помещаю имя атрибута модели, который хочу, так: #{key.path}.

Затем я пытаюсь обработать это с помощью следующего регулярного выражения: @"#{([^}]+)}".

Чтобы обработать это, я использую следующую настройку:

NSString *processedTemplate = [regex stringByReplacingMatchesInString:template 
                                options:0 
                                range:NSMakeRange(0, template.length) 
                                withTemplate:[self valueForKeyPath:@"$1"]];

Однако, когда я запускаю это, я получаю ошибку:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
    reason: '[<Plan 0x78349d0> valueForUndefinedKey:]: this class is not 
             key value coding-compliant for the key $1.'

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

Что касается примечания, я думаю, что я использую это право, но когда я просто запускаю это, чтобы заменить withTemplate:@"$1", я получаю NULL. Итак, я попробовал, используя:

    NSString *processedTemplate = [template stringByReplacingOccurrencesOfString:@"#{([^}]+)}" 
                                    withString:@"$1"
                                       options:NSRegularExpressionSearch 
                                         range:NSMakeRange(0, template.length)];

Однако, когда я запускаю это, он не заменяется разделом в (). Так или иначе, я не делаю что-то правильно. У кого-нибудь есть какие-нибудь указатели / решения?

Обновление

Похоже, что параметр withString: будет интерпретировать @"$1" как что бы ни были найдены данные соответствия регулярному выражению. Есть ли другой способ получить данные о совпадении, чтобы их можно было передавать в такие методы, как valueForKeyPath:?

Обновление

С другой стороны, я не знаю почему, но мое регулярное выражение #{([^}]+)} не соответствует ожидаемому. Любой другой симулятор регулярных выражений, с которым я столкнулся, кажется, просто отлично подходит, но он не совпадает с obj-c на iOS. Есть ли что-то, что я пропускаю с побегами в наборе символов #{}?

1 Ответ

2 голосов
/ 15 декабря 2011

Какой тип объекта self в вашем первом примере?Вы переопределили valueForKeyPath:?

Метод -valueForKeyPath: определен для NSObject, чтобы возвращать значение на основе путей к ключам KVC.Код

obj = [anotherObj valueForKeyPath: @"foo.bar.baz"];

сначала отправит foo на anotherObj, затем отправит bar результат, затем отправит baz результат и вернет окончательный результат.

По сути, среда выполнения жалуется, что у вас нет метода с именем -$1.

И, кстати, в Objective-C параметры для методов оцениваются до самого метода, поэтому

[self valueForKeyPath:@"$1"]

оценивается до stringByReplacingMatchesInString:, а $1 не означает ничего особенного для valueForKeyPath:.

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