美文网首页
iOS变参函数的实现(Objective-C and Swift

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

作者: 深山问 | 来源:发表于2016-02-16 17:21 被阅读555次

    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

          本文链接:https://www.haomeiwen.com/subject/evnpkttx.html