Objective-C
可变参数的函数在Objective-C中不罕见,像Cocoa中的很多常见的函数都是可变参数的,如下:
NSLog(NSString *format, ...)
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ...;
- (instancetype)initWithObjects:(ObjectType)firstObj, ...;
实际上 NSLog 只是简单的调用了另外一个函数 NSLogv
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2) NS_NO_TAIL_CALL;
FOUNDATION_EXPORT void NSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0) NS_NO_TAIL_CALL;
其中针对NSLog 的解释: Simply calls NSLogv, passing it a variable number of arguments.
那我们如何实现自己的变参函数呢,其实我们需要用到C语言中关于变参的一组宏:va_start,va_arg,va_end,以下示例是一个变参函数的实现:
- (NSArray *)varibleMethod:(NSString *)value,...{
NSMutableArray *array = [NSMutableArray array];
va_list list; //指向变參的指针
va_start(list, value); //使用第一个参数来初始化list指针
[array addObject:value];
while (YES) {
//返回可变参数, va_arg第二个参数为可变参数类型,如果有多个可变参数,依次调用可获取各个参数
NSString *string = va_arg(list, NSString*);
if (!string) break;
[array addObject:string];
}
va_end(list); //结束可变参数的获取
return [array copy];
}
函数调用
NSLog(@"%@",[self vairbleMethod:@"11",@"22",@"33",@"44",nil]);
//打印结果: 11, 22, 33, 44
如同大多数变參函数一样, 末尾一定要加上nil,因为这一组宏都没有提供对参数个数的检测.
Swift
Swift中的变參函数设置则相对简单
func sumof(numbers:Int ... ) ->Int{
var sum = 0
for number in numbers {
sum += number
}
return sum
}
方法调用
print("sum: \(self.sumof())")
print("sum: \(self.sumof(10,20,30))")
//执行结果
//sum: 0
//sum: 60
网友评论