我想要一个方法,我可以像NSArray那样放置尽可能多的参数:
- (id)initWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
然后我可以使用:
NSArray *array = [[NSArray alloc] initWithObjects:obj1, obj2, ob3, nil];
我可以添加尽可能多的对象,只要我在末尾添加'nil'告诉它我已经完成了。
我的问题是我怎么知道有多少论点,以及我如何一次一个地通过它们?
答案 0 :(得分:22)
- (void)yourMethod:(id) firstObject, ...
{
id eachObject;
va_list argumentList;
if (firstObject)
{
// do something with firstObject. Remember, it is not part of the variable argument list
[self addObject: firstObject];
va_start(argumentList, firstObject); // scan for arguments after firstObject.
while (eachObject = va_arg(argumentList, id)) // get rest of the objects until nil is found
{
// do something with each object
}
va_end(argumentList);
}
}
答案 1 :(得分:3)
我认为你所谈论的是实现一种可变方法。这应该有所帮助:Variable arguments in Objective-C methods
答案 2 :(得分:3)
我没有使用这些可变方法的经验(因为它们被称为),但是有一些Cocoa功能可以处理它。
来自Apple的技术Q& A QA1405(代码段):
- (void)appendObjects:(id)firstObject, ...
{
id eachObject;
va_list argumentList;
if (firstObject) // The first argument isn't part of the varargs list,
{ // so we'll handle it separately.
[self addObject:firstObject];
va_start(argumentList, firstObject); // Start scanning for arguments after firstObject.
while ((eachObject = va_arg(argumentList, id))) // As many times as we can get an argument of type "id"
{
[self addObject:eachObject]; // that isn't nil, add it to self's contents.
}
va_end(argumentList);
}
}
从http://developer.apple.com/library/mac/#qa/qa2005/qa1405.html
复制答案 3 :(得分:0)
我会尝试这样做:http://www.numbergrinder.com/node/35
为方便起见,Apple在其库中提供访问权限。知道你有多少元素的方法是迭代列表直到你达到零。但是,如果您想将可变数量的参数传递给您正在编写的某个方法,我建议您使用NSArray并遍历该数组。
希望这有帮助!