我遇到[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
编译器告诉我“格式不是字符串文字而没有格式参数”。
你认为有什么方法可以让它发挥作用吗?
答案 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