标签:
swift的函数跟脚本语言
有很多神似之处。 如果有一天用swift开发服务器 ,很期待哇(一切皆有可能,毕竟人家说要跑在Linux上),??
从参数个数来看
无参数
func myFunc()->Int{
}
单参数
func myFunc(first:Int)->Int{
}
多参数
func myFunc(first:Int, other:Int)->Int{
}
从返回值来看
无返回值
func myFunc(){
}
单个返回值
func myFunc()->Bool{
}
多值返回
func myFunc()->(min:Int, max:Int)
元组的成员不需要在函数中返回时命名,因为它们的名字已经在函数返回类型中有了定义
var ret = myFunc() print("min:\(ret.min), max:\(ret.max)")
从参数名称来看
函数参数都有一个外部参数名(external parameter name)和一个本地参数名(local parameter name)。
第一个参数省略其外部参数名,第二个以后的参数使用其本地参数名作为自己的外部参数名。所有参数需要有不同的本地参数名,但可以共享相同的外部参数名
。
func myFunc(first:Int, first A:Int, first B:Int){ } // 但是这么写外部参数名真的好么? myFunc(12, first: 1, first: 3);
使用外部函数名可以使得函数可以用一句话表达清楚,并且使得函数体内部可读,能表达出函数的明确意图。
忽略外部参数名
如果如下:
func myFunc( first:Int, A:Int)->Int{ return 10 } myFunc(12, A: 1) // 这样A,B 也是外部参数名
那么如何实现 直接调用myFunc(12,1)
这样的函数调用呢?
func myFunc(first:Int, _ A:Int)->Int{ return 10 } myFunc(12,1) // OK
默认参数
func myFunc(parameter: Int = 12)->Int{ return parameter } myFunc() //
将带有默认值的参数放在函数参数列表的最后
。这样可以保证在函数调用时,非默认参数的顺序是一致的,同时使得相同的函数在不同情况下调用时显得更为清晰。
可变参数
可变参数
可以接受0个或者多个值
func myFunc(par:Double ...)->Double{ var total:Double = 0 for number in par { total += number } return total } myFunc(1,2,3,4,5) myFunc(1,5,8.9)
一个函数最多只能有一个可变参数
如果函数有一个或多个带默认值的参数,而且还有一个可变参数,那么把可变参数放在参数表的最后
func myFunc(a:Double = 10, par:Double ... )->Double{ var total:Double = a for number in par { total += number } return total } myFunc(par: 1,2,3,4) // 20 myFunc(14, par: 1,2,3,4) // 24
变量参数
就是在函数体内可以改变这个参数的值,默认我们都知道 参数值是个let
var str = "Hello, playground" func myFunc(var str:String)-> String{ str = "@"+str return str } myFunc(str)
对变量参数所进行的修改在函数调用结束后便消失了,并且对于函数体外是不可见的。变量参数仅仅存在于函数调用的生命周期中。
输入输出参数
上面的可变参数仅仅是对函数体内可变,但如何使得一个函数可以修改参数的值,并且想要在这些修改在函数调用结束后仍然存在。那么就有了 In-Out 参数,这个有点像C++的引用。
你只能将变量作为输入输出参数
。你不能传入常量或者字面量
(literal value),因为这些量是不能被修改
的。当传入的参数作为输入输出参数时,需要在参数前加&符
,表示这个值可以被函数修改。
输入输出参数不能有默认值
,而且可变参数不能用 inout 标记
。如果你用 inout 标记一个参数,这个参数不能被 var 或者 let 标记。
func swap(inout a:Int, inout _ b:Int){ let tmp = a a = b b = tmp } var a = 3 // not let a = 3 var b = 107 //swap(3, 107) error swap(&a, &b)
函数类型(Function Types)
()->Void (Int, Int)->(Int, Int) //...
函数类型的使用跟普通类型的使用方法相同,可作为参数类型,也可以是返回类型
函数可以嵌套
func myFunc(a: Int, b:Int)->(Int)->Int{ func addAB(a:Int, _ b:Int)->Int{ return a + b; } func retFunc(a:Int)->Int{ return addAB(a , b) * b } return retFunc } (myFunc(3, b: 4))(3)
对于函数,也许还有些其他的东西,比如自定义操作符,重载,还有泛型,还有一块函数式编程
(我之前的文章也有相关介绍,对于这块我还是相当感兴趣的)。这类的知识我会慢慢补上的,哈哈,大家一起学习,有问题的地方请帮我指出。
标签:
原文地址:http://www.cnblogs.com/Ohero/p/4906258.html