iOS变参函数的实现(Objective-C and Swift)

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

Reference

Difference-between-NSLog-and-NSLogv

你可能感兴趣的:(iOS变参函数的实现(Objective-C and Swift))