3

我有一个问题,[NSString strigWithFormat:format]因为它返回一个 id,并且我有很多代码将 NSString var 更改为其他个人类型。但是编译器并没有阻止我在某些地方将 NSString 设置为另一种类型的对象。

因此,我正在编写一个 NSString 类别,并且我将替换所有对stringWithFormatto的调用myStringWithFormat

代码是:

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



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

编译器告诉我“格式不是字符串文字,也没有格式参数”。

你有什么办法可以使这项工作吗?

4

3 回答 3

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];
}
于 2011-01-17T21:29:52.130 回答
1

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

这有效:

在.h

@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
于 2011-01-16T01:02:43.003 回答
1

这里没有 Objective-C 专家,但是包含省略号的原始方法签名stringWithFormat,它允许您传入将替换为 format 占位符的参数argument

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

于 2011-01-15T23:58:36.343 回答