有时在我们自己的类中提供一个能接受格式化字符串的方法会很方便使用。假设我们要实现的是一个 To Do 应用,它包含一个 Item 类。我们想要提供:
+ (instancetype)itemWithTitleFormat:(NSString *)format, ...
如此我们就可以使用:
Item *item = [Item itemWithFormat:@"Need to buy %@ for %@", food, pet];
这种类型的方法可以接受可变数量的参数,所以被称为可变参数方法。我们必须使用一个定义在stdarg.h里的宏来使用可变参数。上面方法的实现代码可能会像下面这样:
+ (instancetype)itemWithTitleFormat:(NSString *)format, ...;
{
va_list ap;
va_start(ap, format);
NSString *title = [[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:ap];
va_end(ap);
return [self itemWithTitle:title];
}
进一步,我们要添加 NS_FORMAT_FUNCTION
到方法的定义里(在头文件中),如下所示:
+ (instancetype)itemWithTitleFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
NS_FORMAT_FUNCTION
展开为一个方法 __attribute__
,它会告诉编译器在索引1处的参数是一个格式化字符串,而实际参数从索引2开始。这将允许编译器检查格式化字符串而且会像 NSLog() 和 -[NSString stringWithFormat:] 一样输出警告信息。