您的位置:首页 > 移动开发 > Swift

swift 之 函数

2015-10-24 09:53 316 查看
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)


对于函数,也许还有些其他的东西,比如自定义操作符,重载,还有泛型,还有一块
函数式编程
(我之前的文章也有相关介绍,对于这块我还是相当感兴趣的)。这类的知识我会慢慢补上的,哈哈,大家一起学习,有问题的地方请帮我指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: