购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

Tip 15

可变参数函数

可变参数函数指的是可以接受任意多个参数的函数,我们最熟悉的可能就是NSString的-stringWithFormat:方法了。在Objective-C中,我们使用这个方法生成字符串的写法是这样的:

这个方法中的参数是可以任意变化的,参数的第一项是需要格式化的字符串,后面的参数都是向第一个参数中填空。在这里我们不再详细描述Objective-C中可变参数函数的写法(毕竟这是一本Swift的书),但是我相信绝大多数即使有着几年Objective-C经验的读者,也很难在不查阅资料的前提下正确写出一个接受可变参数的函数。

但是这一切在Swift中得到了前所未有的简化。现在,写一个可变参数的函数只需要在声明参数时在类型后面加上...就可以了,比如下面就声明了一个接受可变参数的Int累加函数:

输入的input在函数体内部将被作为数组[Int]来使用,让我们来完成上面的方法吧。当然你可以用传统的for...in做累加,但是这里我们选择了一种看起来更Swift的方式:

Swift的可变参数十分灵活,在其他很多语言中,因为编译器和语言自身语法特性的限制,可变参数往往只能作为方法中的最后一个参数来使用,而不能先声明一个可变参数,然后再声明其他参数。这是很容易理解的,因为编译器将不知道输入的参数应该从哪里截断。这个限制在Swift中是不存在的,因为我们会对方法的参数进行命名,所以我们可以随意地放置可变参数的位置,而不必拘泥于最后一个参数:

限制自然是有的,比如在同一个方法中只能有一个参数是可变的,可变参数都必须是同一种类型的,等等。对于后一个限制,当我们想要同时传入多个类型的参数时就需要做一些变通。比如最开始提到的-stringWithFormat:方法。可变参数列表的第一个元素是等待格式化的字符串,在Swift中这会对应一个String类型,而剩下的参数应该可以是对应格式化标准的任意类型。一种解决方法是使用Any作为参数类型,然后对接收到的数组的首个元素进行特殊处理。不过因为Swift中可以使用下画线_作为参数的外部标签,使得调用时不需要再加上参数名字。我们可以利用这个特性,在声明方法时就指定第一个参数为一个字符串,然后跟一个匿名的参数列表,这样在写起来的时候就“好像”是所有参数都是在同一个参数列表中进行的处理,会好看很多。比如Swift的NSString格式化的声明就是这样处理的: 8JDplTjF9maCULJ6zU5MHqGbu0KbtSUYX20+YUMazAGFglla8KtH0pz92UVOnSKj

点击中间区域
呼出菜单
上一章
目录
下一章
×