前言:
又到了发文的时间了,最近我的屁股一直长疔子真的好痛,有人知道要怎么治标吗,一直跪着打程式也不是办法吧...,希望有经验的朋友能够给我建议。哭啊~~
不能只会func吗?
当学会如何写func又突然看到名为Closure的东西时真得会一个头两个大,而且他们看起来也超像,真的不能只学一个吗?答案当然是可以阿,只要你不要写Closure就不要学^^,好拉还是要学一下毕尽在开发上它的用武之地真的还蛮多地方的,那我们就赶快开始吧。
首先
首先让我们複习一般函式的写法
func addition(num1:float ,num2:float)-> Float { return num1 + num2}addition( num1:3 , num2:5 )// 8
这是一个加法的函式,若不了解的话记得先去看函式怎么写,BTW和JS相较之下真的有点差异。
什么是Closure?
目前我们先把它想成没有名字的函式。在JS的话匿名函式最常使用的函式是箭头函式吧...。
把上面的函式改成Closure
我们先了解一般函式改成Closure的几个步骤
1.将函式名及函式名称删除
2.若有参数则把他放入大括号内
3.把参数放入大括号内后加入in
範例
let addtion = { (num1:Float, num2:Float) -> Float in return num1 + num2}addtion(2, 5)// 7
此时你会发现func及closure的第一个不同:在呼叫closure时没有参数名
Closure有型别吗?
答案是有的!
那是什么?我们还是利用上面的例子,我们已经将Closure放进变数addtion里面了,并且透过addtion来呼叫。
而我们也可以加上addtion的型别
let addtion:(Float,Float)->Float = { (num1:Float, num2:Float) -> Float in return num1 + num2}addtion(2, 5)//7
此型别为接受两个浮点数为参数之后回传一个浮点数值
他就是一个值而已啦!!
其实阿,不用把closure看的这么複杂,其实他就是一个值而已,就像 x = 3 一样是一个值而已。
真假!!他能当参数和回传值
没错就是如此closure可以当参数和回传值,因为刚刚才说到closure就是一个值而已所以有何不可呢。
closure当作参数
现在我们来示範如何把closure当作参数吧。
func calculate(num1:Float,num2:Float, operation:(Float,Float)->Float){ print(operation(num1,num2))}calculate(num1: 2, num2: 5, operation: addtion)// 7
此作法为先建立一个名为calculate的函式,此函式必须有三个参数,其中名为operation的参数,需传入接受两个浮点数并回传一个浮点数的型别,诶~~有没有很熟悉啊,跟我们一开始建立的addtion很像呦,没错不要怀疑就放进去吧,就跟你平常一样放进去吧^^,在呼叫calculate的时候就可以像上面那样。
closure当作回传值
closure当然也可以当作回传值。
func MutiplyClosure()->(Float,Float)->Float{ return addtion}let doMutiply = MutiplyClosure()doMutiply(3,5)// 8
其实满好理解的对吧!!
下次我来整理如何简写你的Closure让他看起来更加简洁,好拉我要去睡觉了掰掰。