Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候在Objective-C方法中使用变量参数合适?_Objective C_C_Variadic Functions - Fatal编程技术网

什么时候在Objective-C方法中使用变量参数合适?

什么时候在Objective-C方法中使用变量参数合适?,objective-c,c,variadic-functions,Objective C,C,Variadic Functions,什么时候适合编写具有可变参数数的方法(如NSString的+stringWithFormat:) Apple对可变方法的简要搜索似乎只包括两类:创建数据结构时(NSArray+arrayWithObjects:,NSSet+setWithObjects:),或格式化字符串时(NSString+stringWithFormat:,NSPredicate+predicateWithFormat:) 苹果的示例与前面提到的数据结构方法略有不同,但仍然属于同一阵营 在任何其他情况下使用变量方法是否合适?

什么时候适合编写具有可变参数数的方法(如
NSString的+stringWithFormat:

Apple对可变方法的简要搜索似乎只包括两类:创建数据结构时
(NSArray+arrayWithObjects:,NSSet+setWithObjects:)
,或格式化字符串时
(NSString+stringWithFormat:,NSPredicate+predicateWithFormat:)

苹果的示例与前面提到的数据结构方法略有不同,但仍然属于同一阵营

在任何其他情况下使用变量方法是否合适?苹果呢

什么时候编写一个参数数目可变的方法(比如NSString的+stringWithFormat:)合适

此方法使用类似于
printf
的属性,该属性根据附加参数检查格式字符串。使用格式字符串时,应始终向方法/函数添加属性

Apple对可变方法的简短搜索似乎只包括两类:创建数据结构时(NSArray的+arrayWithObjects:,NSSet的+setWithObjects:),或格式化字符串时(NSString的+stringWithFormat:,NSPredicate的+predicateWithFormat:)

此表单使用
nil
sentinel。这实际上有点轻松,因为意外的
nil
可以在没有错误或警告的情况下默默地截断参数。例如,(新的ish)Objective-C文本不使用这种形式;它们使用的实现也将count作为参数,传递
nil
元素是错误的


在任何其他情况下使用变量方法是否合适

它在C语言中的许多地方都有使用,也有可变宏。通常,您应该寻找替代方案,因为variadics是一种不太安全的API

我将使用它们的一个地方是,如果我需要包装一个API。在这种情况下,我只将参数转发给采用va_列表的API


您可以为几乎所有用例找到更安全的替代方案,尤其是在引入块之后。

据我所知,Cocoa对参数数量可变的函数的使用仅限于您提到的两类。例如,
NSLog
NSAssert
可以被视为第二类函数,因为它格式化字符串

但是,在其他情况下,参数数目可变的函数可能非常有用

例如,可以定义用于计算表达式的API,如下所示:

NSNumber *res = [Evaluator evalExpression:@"%1 + %2 * %3", @10, @20, @5];
// returns @110
MyXmlTree *tree = [MyXmlTree addElementWithTag:@"root" andChildren:
    [MyXmlTree elementWithTag:@"hello"]
,   [MyXmlTree elementWithTag:@"world"]
,   nil];
另一个例子是用于组合XML的API,如下所示:

NSNumber *res = [Evaluator evalExpression:@"%1 + %2 * %3", @10, @20, @5];
// returns @110
MyXmlTree *tree = [MyXmlTree addElementWithTag:@"root" andChildren:
    [MyXmlTree elementWithTag:@"hello"]
,   [MyXmlTree elementWithTag:@"world"]
,   nil];

第二个例子是组成数据结构的更复杂的情况(即组成一棵树,而不是定义一个线性结构)。

这太宽泛了。您是否有特定的函数要使用变量参数?这在很大程度上取决于您的需要。您有任何方法可以对可变数量的参数进行操作吗?如果否,则首选使用命名参数。