• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Objective-C语法之可变参数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

可变参数的方法在Objective-C中不罕见,像Cocoa中的很多常见的方法都是可变参数的,如:

1 NSLog(NSString *format, ...)
2 + (id)arrayWithObjects:(id)firstObj, ...
3 + (id)dictionaryWithObjectsAndKeys:(id)firstObject , ...

 

那我们如何实现自己的变参方法呢,其实我们需要用到C语言中关于变参的一组宏:va_list,va_start,va_arg,va_end,以下示例是一个变参方法的实现:

main.m

 1 #import <Foundation/Foundation.h>
 2 #import "ChangeableParameterClass.h"
 3 int main(int argc, const char * argv[]) {
 4     @autoreleasepool {
 5         [ChangeableParameterClass method:@"测试可变参数"
 6                           withAuthorName:@"Kenmu"
 7                  withChangeableParameter:@"firstParameter", @"secondParameter", @"thirdParameter", @"fourthParameter", @"fifthParameter", nil];
 8     }
 9     return 0;
10 }

 

ChangeableParameterClass.h

 1 #import <Foundation/Foundation.h>
 2 @interface ChangeableParameterClass : NSObject
 3 /**
 4 *  测试可变参数
 5 *
 6 *  @param name           名称
 7 *  @param authorName     作者名称
 8 *  @param firstParameter 可变参数的第一个参数元素,“,...”表示可能存在后面的多个参数元素(可变参数必须是作为方法的最后一个参数,以“,...”方式结尾)
 9 */
10 + (void)method:(NSString *)name withAuthorName:(NSString *)authorName withChangeableParameter:(NSString *)firstParameter,...;
11 @end

 

ChangeableParameterClass.m

 1 #import "ChangeableParameterClass.h"
 2 @implementation ChangeableParameterClass
 3 + (void)method:(NSString *)name withAuthorName:(NSString *)authorName withChangeableParameter:(NSString *)firstParameter,... {
 4     NSLog(@"%@,作者:%@", name, authorName);
 5     
 6     va_list list; //指向可变参数的指针list
 7     va_start(list, firstParameter); //使用第一个参数来初使化指针list
 8     NSLog(@"strCurrent=%@", firstParameter); //strCurrent=firstParameter
 9     while (YES) {
10         NSString *strCurrent = va_arg(list, NSString *);
11         if (!strCurrent) {
12             break;
13         }
14         NSLog(@"strCurrent=%@", strCurrent); //strCurrent=secondParameter...
15     }
16     va_end(list); //结束可变参数的获取
17 }
18 @end

像大多数变参方法一样,未尾一定要加上nil,因为这一组宏都没有提供对参数个数的检测,当然你会问为何NSLog的参数中我们都不用在末尾添加nil的参数呢,那是因为NSLog的第一个参数是一个格式化字符串,通过这个字条串就能获得后面的参数个数,所以如果你的方法还能有其它的参数能够显式的指出变参个数,当然你也可以书写(但在方法体中需要修改为按已知个数调用va_arg),但是我仍然推荐以上的写法!

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap