IOS Swift 什麽是Closure?不能只会func吗?

前言:

又到了发文的时间了,最近我的屁股一直长疔子真的好痛,有人知道要怎麽治标吗,一直跪着打程序也不是办法吧...,希望有经验的朋友能够给我建议。哭啊~~
https://ithelp.ithome.com.tw/upload/images/20210423/201367535Eza9QX1ee.jpg


不能只会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让他看起来更加简洁,好拉我要去睡觉了掰掰。


<<:  [Day 36] 自我介绍後台及前台(五) - 前台的自我介绍页

>>:  WordPress网站加速历程-SiteGround与CLOUDWAYS的TTFB比较

【D7】取得历史资料:三大法人-区分期货与选择权二类

前言 在昨日取得的资料仅有当天的资讯,政府有提供下载近三年的资料,更多就需要申请,不过我们这三年已经...

C/C++ struct使用

建立一个结构 使用方式如下 struct 结构名称{ 结构变数; }; 例如: 宣告时 struct...

JavaScript Day06 - 流程判断

if else 与 else if 参考 Day06 - 变数(03) - BMI、Day11 - ...

Day21:安全性和演算法-共用金钥密码系统(shared-key crypto system)

前言 前一天我们有稍微提到安全性演算法的其中一个,也就是今天的主题「共同金钥密码系统」(shared...