Cocoa - 从另一个variadic方法调用一个可变方法(NSString stringWithFormat调用)

时间:2011-01-15 23:52:52

标签: cocoa nsstring compiler-warnings categories variadic

我遇到[NSString strigWithFormat:format]的问题,因为它返回一个id,我有很多代码,我将NSString var更改为其他个人类型。但是编译器并没有阻止我将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 个答案:

答案 0 :(得分:6)

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 :(得分:1)

此处没有Objective-C专家,但stringWithFormat的原始方法签名包含省略号,允许您以argument格式传递将替换为占位符的参数。

编辑:stringWithFormat是一种所谓的可变参数方法。这是一个link的示例。

答案 2 :(得分:1)

感谢您的帮助。 阅读参考文献,我找到了解决方案!

这有效:

在.h

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

在.m

@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