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);
        }
        
    }
  • 相关阅读:
    IIS7中的几种身份鉴别方式(一)Basic身份验证
    IIS7中的几种身份鉴别方式(二)集成身份验证
    java集合
    SharePoint 2010中welcome page的设置细节
    SharePoint中使用Linq出现未将对象引用到实例化的解决方法
    SharePoint 2010中关于An error was encountered while retrieving the user profile的处理方式记录
    The Need for an Architectural Body of Knowledge
    The Softer Side of the Architect
    Event Receivers 学习小结
    使用SmtpClient发送带图片的邮件的代码实现
  • 原文地址:https://www.cnblogs.com/huen/p/3528156.html
Copyright © 2011-2022 走看看