gpt4 book ai didi

objective-c - 使用 ARC 将可变参数从一种方法传递到另一种方法

转载 作者:太空狗 更新时间:2023-10-30 03:53:31 26 4
gpt4 key购买 nike

我正在尝试将可变参数 (NSString *) 从一种方法传递到另一种方法,如下例所示:


- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ... {
// ... do something with parts
}

- (NSURL *)specialUrlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ... {
va_list arg;
va_start(args, aPart);
[self urlForId:aId params:aParam parts:args];
va_end(args);
}

当尝试传递参数时,问题就开始了。 ARC 提示从 va_list (char *) 到 NSString * 的隐式转换。我已尽一切努力使它正常工作。

如果我将 va_list 传递给 [NSString stringWithFormat:...],同样的技术也会起作用,所以我不明白为什么它在这里不起作用。

感谢任何帮助。

最佳答案

您的 urlForId:params:parts: 方法期望 parts: 键盘之后的第一个参数是 NSString*,但是您重新传递一个 va_list。这些是不同的类型。将 va_list 变量作为函数参数传递并不会神奇地将其扩展为所有原始参数。在幕后,va_list 实际上只是指向您的堆栈帧的指针,这就是所有要传递的内容。

在这里您真正需要做的是提取遍历​​零件列表的 urlForId:params:parts: 部分,并直接从 specialUrlForId:params 调用该提取出的部分:零件:。大概你的 urlForId:params:parts: 方法看起来像这样:

- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ...
{
va_list ap;
va_start(ap, aPart);

// loop over the variable arguments, starting with aPart, perhaps
// stopping when you find nil.
while (aPart != nil) {
doSomething(aPart);
aPart = va_arg(ap, NSString *);
}

va_end(ap);

return someUrl;
}

因此,您在这里要做的是将 va_start 之后和 va_end 之前的部分移动到采用 va_list 参数的方法:

- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams arguments:(va_list)ap
{
// loop over the variable arguments, starting with aPart, perhaps
// stopping when you find nil.
while (aPart != nil) {
doSomething(aPart);
aPart = va_arg(ap, NSString *);
}
return someUrl;
}

然后你让 urlForId:params:parts:specialUrlForId:params:parts: 调用这个新的 urlForId:params:arguments:方法:

- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ...
{
va_list ap;
va_start(ap, aPart);
NSURL *url = [self urlForId:aId params:aParams arguments:ap];
va_end(ap);
return url;
}

- (NSURL *)specialUrlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ...
{
va_list ap;
va_start(ap, aPart);
NSURL *url = [self urlForId:aId params:aParams arguments:ap];
va_end(ap);
return url;
}

关于objective-c - 使用 ARC 将可变参数从一种方法传递到另一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8499730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com