Objective-C语法之可变参数

可变参数的方法在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),但是我仍然推荐以上的写法!

时间: 2024-10-27 08:14:10

Objective-C语法之可变参数的相关文章

Java重要技术(2)语法之可变参数

1.1. 可变参数 可变参数指在定义函数时,函数的参数的个数不确定,调用者可以传入不同个数的参数. 可变参数使用如下方式定义,可变参数只能是函数的最后一个参数. 类型 ...  参数名称 可变参数被编译为数组,因此在函数中可以当做数组使用. /** * @Title: VariableParameterTest.java * @Package com.test.javatechnology * @Description: * @author http://www.cnblogs.com/coe2

参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

在Python中定义函数,可以用必选参数.默认参数.可变参数.关键字参数和命名关键字参数,这5种参数都可以组合使用.但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数.命名关键字参数和关键字参数. Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数. 默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误! 要注意定义可变参数和关键字参数的语法: *args是可变参数,args接收的是一个tuple: **kw是关键字参数,kw接收的

可变参数和关键字参数

# *args 和 **kw# *args是可变参数,args接收的是一个tuple:# **kw是关键字参数,kw接收的是一个dict.# 以及调用函数时如何传入可变参数和关键字参数的语法:# 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3)):# 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2}).# 使用*

javaweb学习总结二(静态导入、自动拆装箱、增强for与可变参数)

一:静态导入语法:import static 导入类.成员变量|成员方法那么在代码中可以直接使用变量或者方法,而不需要通过类名.来调用 静态导入: 1 import static java.lang.System.out; 那么在代码中直接调用变量: 1 @Test 2 //测试静态导入 3 public void testStaticImport() { 4 out.println("static import..."); 5 } 二:装箱或者拆箱装箱:将基本数据类型赋值给引用数据类

函数的可变参数

一.可变参数介绍: 1.一个方法定义好了参数,在调用时必须传入与其一一对应的参数 2.但是在JDK1.5之后提供了新的功能,可以根据需要自动传入任意个数的参数 3.其实就是一个数组,但是接收的是数组的元素,自动将这些元素封装成数组,简化了调用者的书写(注意:可变参数类型必须定义在参数列表的结尾处) 4.可变参数语法: 返回值类型 方法名称(数据类型....参数名称){ } 二.代码实例 public class ParamterDemo { public static void main(Str

Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱

JDK1.5已经发布很长时间,之所以还拿出来是因为它增加了很多个重要的特性,使用这些特性有助于我们简化开发,编写的代码更加简洁清晰安全,主要有以下几个特性: ?  静态导入 ?  可变参数 ?  增强for循环 ?  自动拆装箱 ? 泛型 ? 枚举 由于泛型.枚举内容比较多,也最重要,之后单拿出来讲.这里先介绍前面四个简单而又实用的小特性. 1. 静态导入 所谓"静态导入"只不过是在普通的import语句中加入关键字static,例如: ?  非静态导入:import java.lan

C语言可变参数函数实现原理

一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本文地址:http://www.cnblogs.com/archimedes/p/variable-parameter.html,转载请注明源地址. 例如,对于函数: void fun(int a, int b, int c) { int d; ... } 其栈结构为 0x1ffc-->d 0x200

C,C++中使用可变参数

可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是int,double还可以是char*,类,结构体等等.可变参数是实现printf(),sprintf()等函数的关键之处,也可以用可变参数来对任意数量的数据进行求和,求平均值带来方便(不然就用数组或每种写个重载).在C#中有专门的关键字parame,但在C,C++并没有类似的语法,不过幸好提供这方面的处理函数,本文将重点介绍如何使用这些函数. 第一步 可变参数表示 用三个点-来表示,查看printf()函数和scanf

C语言中宏定义之 ## 用于可变参数

GCC 支持复杂的宏,它使用一种不同的语法,使你可以给可变参数一个名字,如同其它参数一样,比如: 引用 #define debug(format, args...) fprintf(stderr, format, args) 这种定义可读性更强,也更容易描述.完整测试代码: 引用 #include <stdio.h> #define debug(format, args...) fprintf(stderr, format, args) int main(){    char a[20] =