函数
看一个函数的例子:
func addNumbers( let@H_404_9@ a:Int,let@H_404_9@ b:Int)@H_404_9@->@H_404_9@Int{
return@H_404_9@ a+b;
}
实现两个数相加。函数必须以func开头,后面是函数名,小括号里是参数,箭头后面是返回类型。Swift中没有int之类的基本类型了,连表示数字都用类:Int。因为参数没有在函数内改变值,所以参数定义成常量。不论是类的方法或全局函数,语法一样。不像ObjC那样,全局函数是C语法,类方法是ObjC语法。
这样调用它:
let@H_404_9@ r = addNumbers(3@H_404_9@,b: 4@H_404_9@)
可以看到从第二个参数开始,需要带参数名。
函数要通过return返回多个值在ObjC中是做不到的,当然你可以放到一个数组或字典中把这个数组或字典返回。返回后再取出来也比较麻烦。如果你写的函数是给别人用的话,还要注释说明白,里面的各项数据是如何排列的。但现在语法已经支持了:用元组!下面这个例子是取得两个数相除的商和余数:
func divNumbers(a@H_404_9@:Int,b:Int)->(shang:Int,yu:Int){
return@H_404_9@ (shang:a@H_404_9@/b,yu:a@H_404_9@%b)
}
箭头后是返回值类型,看起来像参数,实际上就是定一了一个元组类型。return时,定义了一个元组对象,填入了两个数据的值。调用此函数:
let@H_404_9@ ret = div@H_404_9@Numbers@H_404_9@(7@H_404_9@,b: 3@H_404_9@)
print@H_404_9@(ret)@H_404_9@ print@H_404_9@(ret.shang)@H_404_9@@H_404_9@
可变参数
func average(numbers:Int...)@H_404_9@->@H_404_9@Float{
var@H_404_9@ he=0@H_404_9@
for@H_404_9@ num in@H_404_9@ numbers {
he += num
}
return@H_404_9@ Float(he)/Float(numbers.count)
}
可以看到可变参数在函数内实际上是一个数组。
嵌套定义
函数还可以嵌套定义,就是在一个函数体内定义另一个函数,并且内部的函数可以随意使用所在函数的临时变量,反过来就不行。如:
func@H_404_9@ test(){
var@H_404_9@ a=0@H_404_9@;
//定义内部函数@H_404_9@
func@H_404_9@ add(){
a+=100@H_404_9@ //直接操作外部变量@H_404_9@
}
//调用内部函数@H_404_9@
add()
print@H_404_9@(a)
}
函数做返回值
//返回值类型是一个函数,其参数是整型,返回是整型
func testReturn()@H_404_9@->@H_404_9@((Int)->Int)@H_404_9@{ //定义要返回的函数 func@H_404_9@ action@H_404_9@(a:Int)@H_404_9@->@H_404_9@Int{
return@H_404_9@ a*a
}
//@H_404_9@返回这个函数对象
return@H_404_9@ action
}
let@H_404_9@ retFunc = testReturn()
//@H_404_9@定义返回的函数
let@H_404_9@ bb = retFunc(22@H_404_9@)
这事并没有什么特殊的,在C语言时代就可以啊。
函数做参数
比如数组排序函数中,比较两个相邻元素的代码可以放到函数中,比较函数做为参数传入,例子:
//@H_404_9@比较函数
func compare(arr:[Int],firstIndex:Int,secondIndex:Int)@H_404_9@->@H_404_9@Bool{
if@H_404_9@(arr[firstIndex]>arr[secondIndex]) {
return@H_404_9@ true@H_404_9@
}
return@H_404_9@ false@H_404_9@
}
//@H_404_9@冒泡排序
func sort(var@H_404_9@ arr:[Int],compareFunc:([Int],Int,Int)->Bool)@H_404_9@{ //请大家自行写出冒泡排序代码。。。 for@H_404_9@(var@H_404_9@ i=arr.count-1@H_404_9@;i>0@H_404_9@;i--)@H_404_9@{ for@H_404_9@(var@H_404_9@ j=0@H_404_9@;j<i;j++)@H_404_9@{ //这里是比较的代码 if@H_404_9@(compareFunc(arr,j,j+1@H_404_9@))@H_404_9@{ let@H_404_9@ tmp@H_404_9@ = arr@H_404_9@[j@H_404_9@] arr@H_404_9@[j@H_404_9@]=arr@H_404_9@[j@H_404_9@+1] arr@H_404_9@[j@H_404_9@+1]=tmp@H_404_9@ } } } } var@H_404_9@ arr@H_404_9@ = [100,33,22,4353,67,6865,43,454] sort@H_404_9@(arr,compareFunc: compare)@H_404_9@@H_404_9@
闭包
闭包跟嵌套函数实质没区别,可以直接用所在函数体的变量,唯一的差别就是名字。用闭包实现比较函数:
sort(arr,compareFunc@H_404_9@: {
(arr:[Int],secondIndex:Int)@H_404_9@->@H_404_9@Bool in@H_404_9@
if@H_404_9@(arr[firstIndex]>arr[secondIndex]) {
return@H_404_9@ true@H_404_9@
}
return@H_404_9@ false@H_404_9@
})
闭包的写法可以更简:
sort(arr,compareFunc: {
if@H_404_9@($0@H_404_9@[$1@H_404_9@]>$0@H_404_9@[$2@H_404_9@]) {
return@H_404_9@ true@H_404_9@
}
return@H_404_9@ false@H_404_9@
})
可以看到省掉了函数类型说明,参数直接用序号来操作。