zoukankan      html  css  js  c++  java
  • OC中实现可变参数

    通过哨兵参数实现,相当于nil.

    1.c语言中

    #import <stdio.h>
    #import <stdarg.h>
    
    int addemUp(int firstNum,...)
    {
        va_list args;//指向参数的指针
        int sum = firstNum;
        int number;
        
        va_start(args, firstNum);//firstNum是...前1个参数
        while(1)
        {
            number = va_arg(args, int);//返回参数列表中指针args所指的参数,返回类型为type,并使指针args指向参数列表中下一个参数。
            printf("number = %d
    ",number);
            sum += number;//求和
            if (number == 0)
            {
                break;
            }
        }
        va_end(args);//清空参数列表,并置参数指针args无效
        return sum;
    
    }
    
    int main(int argc, const char * argv[])
    {
        printf("sum of %d
    ",addemUp(1,2,3,4,5,0));
           return 0;
    }

    于是哨兵参数(sentinel)这个东西就出来了。上面例子中最后一个参数0就是一个哨兵参数,它的作用就是告诉函数没有参数了。这也是为什么ObjC中[NSArray arrayWithObjects: ...,nil]最后必须以nil参数结尾的原因。
    使用__attribute__((sentinel))语法可以告诉编译器这是一个需要哨兵参数的函数。

    #import <stdio.h>
    #import <stdarg.h>
    
    void printString(char *first,...) __attribute__((sentinel));
    
    void printString(char *first,...)
    {
        va_list args;
        va_start(args,first);
        char *string = first;
        while (string != nil)
        {
            printf("%s",string);
            string = va_arg(args, char *);
            printf("
    ");
        }
        va_end(args);
        printf("
    ");
    }
    
    int main(int argc, const char * argv[])
    {
        printString("spicy","pony",nil);
            return 0;
    }

    -(void)setTitleWithString:(NSString *)title,... __attribute__((sentinel))
    {
        NSMutableArray *argsArray = [[NSMutableArray alloc]init];
        if(title)
        {
            [argsArray addObject:title];
            
            va_list params;        //定义一个指向个数可变的参数列表指针
            va_start(params,title);    //va_start  得到第一个可变参数地址        
            NSString *arg;
            while((arg = va_arg(params, NSString *)))//va_arg 指向下一个参数地址
            {
                if(arg)
                {
                    [argsArray addObject:arg];
                }
            }
            va_end(params);        //置空
        }
        
        for(NSString *s in argsArray)
        {
            NSLog(@"%@",s);
        }
        
    }

    http://www.cnblogs.com/huen/p/3528156.html
  • 相关阅读:
    Today
    react-decorator-track 解耦-埋点方案
    Decorator
    webpack4强势来袭
    同源策略与跨域处理
    html语义化
    深度遍历与广度遍历的理解
    Javascript 模块化理解
    算法之排序
    数组去重
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10370891.html
Copyright © 2011-2022 走看看