C 如何将可选参数发送到另一个函数/方法?
我有一个带有可选参数的指定初始值设定项(类似于下面的代码),我想通过调用它来创建一个autorelease方法。有没有办法做到这一点C 如何将可选参数发送到另一个函数/方法?,c,objective-c,C,Objective C,我有一个带有可选参数的指定初始值设定项(类似于下面的代码),我想通过调用它来创建一个autorelease方法。有没有办法做到这一点 @interface MyObject : NSObject - (id)initWithArgs:(id)firstArg, ...; + (id)objectWithArgs:(id)firstArg, ...; @end @implementation MyObject - (id)initWithArgs:(id)firstArg, ... {
@interface MyObject : NSObject
- (id)initWithArgs:(id)firstArg, ...;
+ (id)objectWithArgs:(id)firstArg, ...;
@end
@implementation MyObject
- (id)initWithArgs:(id)firstArg, ...
{
if (!firstArg || ![super init]) {
return nil
}
va_list argList;
va_start(argList, firstArg);
id currentObject = firstArg;
do {
NSLog(@"%@", currentObject);
} while ((currentObject = va_arg(argList, id)) != nil);
va_end(argList);
return self;
}
+ (id)objectWithArgs:(id)firstArg, ...
{
// return [[[MyObject alloc] initWithArgs:firstArg, ...] autorelease];
}
@end
你不能这么做。看。您可以做的最接近的事情是创建两个版本的函数,一个采用varargs(…
),另一个采用va_列表。varargs版本可以将工作传递到va_列表
版本,以避免重复代码:
@interface MyObject : NSObject
- (id)initWithArgs:(id)firstArg, ...;
- (id)init:(id)firstArg withVaList:(va_list)args;
+ (id)objectWithArgs:(id)firstArg, ...;
+ (id)object:(id)firstArg withVaList:(va_list)args;
@end
@implementation MyObject
- (id)initWithArgs:(id)firstArg, ...
{
va_list args;
va_start(args, firstArg);
id result = [self init:firstArg withVaList:args];
va_end(args);
return result;
}
- (id)init:(id)firstArg withVaList:(va_list)args
{
// do actual init here:
while((id arg = va_arg(args, id)))
{
// ...
}
}
+ (id)objectWithArgs:(id)firstArg, ...
{
va_list args;
va_start(args, firstArg);
id result = [MyObject object:firstArg withVaList:args];
va_end(args);
return result;
}
+ (id)object:(id)firstArg withVaList:(va_list)args
{
return [[[MyObject alloc] init:firstArg withVaList:args] autorelease];
}
@end
你不能这么做。看。您可以做的最接近的事情是创建两个版本的函数,一个采用varargs(…
),另一个采用va_列表。varargs版本可以将工作传递到va_列表
版本,以避免重复代码:
@interface MyObject : NSObject
- (id)initWithArgs:(id)firstArg, ...;
- (id)init:(id)firstArg withVaList:(va_list)args;
+ (id)objectWithArgs:(id)firstArg, ...;
+ (id)object:(id)firstArg withVaList:(va_list)args;
@end
@implementation MyObject
- (id)initWithArgs:(id)firstArg, ...
{
va_list args;
va_start(args, firstArg);
id result = [self init:firstArg withVaList:args];
va_end(args);
return result;
}
- (id)init:(id)firstArg withVaList:(va_list)args
{
// do actual init here:
while((id arg = va_arg(args, id)))
{
// ...
}
}
+ (id)objectWithArgs:(id)firstArg, ...
{
va_list args;
va_start(args, firstArg);
id result = [MyObject object:firstArg withVaList:args];
va_end(args);
return result;
}
+ (id)object:(id)firstArg withVaList:(va_list)args
{
return [[[MyObject alloc] init:firstArg withVaList:args] autorelease];
}
@end
在具有方法重载的语言中执行默认参数的常用方法是:
function foo(bar, baz) {
... actual function code here ...
}
function foo(bar) {
foo(bar, 42)
}
在具有方法重载的语言中执行默认参数的常用方法是:
function foo(bar, baz) {
... actual function code here ...
}
function foo(bar) {
foo(bar, 42)
}
下次先搜索站点时,会有大量重复项。下次先搜索站点时,会有大量重复项。应该如何-(id)initWithVaList:(va_list)args在args上迭代?这就是我试过的。每个项目的id;while(eachObject=va_arg(args,id))的结果是当我这样做时,第一个参数不是在while循环中找到的..如何-(id)initWithVaList:(va_list)args在args上迭代?这就是我试过的。每个项目的id;while(eachObject=va_arg(args,id))结果是当我这样做时,第一个参数不会在while循环中找到。。