Какао - вызов метода с переменным числом из другого метода с переменным числом (вызов NSString stringWithFormat) - PullRequest
3 голосов
/ 16 января 2011

У меня проблема с [NSString strigWithFormat:format], потому что он возвращает идентификатор, и у меня много кода, где я изменил переменную NSString на другой персональный тип.Но компилятор не мешает мне, что есть места, где NSString будет установлен в объект другого типа.

Так что я пишу категорию NSString и собираюсь заменить все мои вызовыдо stringWithFormat до myStringWithFormat.

Код:

@interface NSString (NSStringPerso)
+ (NSString*) myStringWithFormat:(NSString *)format;
@end



@implementation NSString (NSStringPerso)
+ (NSString*) myStringWithFormat:(NSString *)format {
    return (NSString*)[NSString stringWithFormat:format];
}
@end

Компилятор сообщает мне, что «Формат не строковый литерал и не аргументы формата».* Вы видите какой-нибудь способ сделать эту работу?

Ответы [ 3 ]

6 голосов
/ 18 января 2011

NSString включает метод, который получает список аргументов из функции с переменными числами. Посмотрите на этот пример функции:

void print (NSString *format, ...) {
    va_list arguments;
    va_start(arguments, format);

    NSString *outout = [[NSString alloc] initWithFormat:format arguments:arguments];
    fputs([output UTF8String], stdout);
    [output release];

    va_end(arguments);
}

Часть этого кода не имеет значения, но ключевая строка - NSString *output = [[NSString alloc] initWithformat:format arguments:arguments];. Вот как вы можете построить NSString в функции / методе с переменным значением.


В вашем случае ваш код должен выглядеть примерно так:

+ (NSString *)myStringWithFormat:(NSString *)format, ... {
    va_list arguments;
    va_start(arguments, format);

    NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:arguments];
    va_end(arguments);

    // perform some modifications to formattedString

    return [formattedString autorelease];
}
1 голос
/ 16 января 2011

Спасибо за вашу помощь. Читая ваши справочные документы, я нашел решение!

Это работает:

В .ч

@interface NSString (NSStringPerso)
+ (NSString*) strWithFormatPerso:(id)firstObject, ...;
@end

В .м

@implementation NSString (NSStringPerso)
+ (NSString*) strWithFormatPerso:(id)firstObject, ... {

    NSString* a;

    va_list vl;
    va_start(vl, firstObject);
    a = [[[NSString alloc] initWithFormat:firstObject, vl] autorelease];
    va_end(vl);

    return a;
}
@end
1 голос
/ 16 января 2011

Здесь нет специалиста Objective-C, но исходная сигнатура метода для stringWithFormat включает в себя эллипсы, которые позволяют передавать аргументы, которые будут заменены заполнителями в формате argument.

РЕДАКТИРОВАТЬ: stringWithFormat - это так называемый variadic метод.Вот ссылка на пример.

...