前言:
屁屁痛了一整晚昨天全程跪着打文章,都这样了你们该进来看一下了吧,顺带一提如果有对Swift其他主题或功能感兴趣的话,可以在下面留言让我知道,我会查资料并整理给大家,今天刚吃完早餐没什么要抱怨的..,那就直接开始吧。
上次
上次我们聊完Closure的是什么及如何缩写它,这次我想聊Closure的其它用法。
乾我屁事啊
很多事情感觉看似不甘你的事,但那些鸟事也会自己找上门来...,你一定没办法想像阵列处理跟Closure有关吧!!
我们知道阵列处理的方法有很多,像是map、filter、forEach、sort...一大堆(如果有兴趣可以参考板上的巨巨写的有关阵列处理的文章,真的写很好),而今天我们来讲阵列方法结合Closure的处理。
map地图先生你好
很多人在处理阵列时时常会看到他吧,以前我还经常跟forEach搞混呢!简而描述他们的差别就是,map在阵列处理结束后会存到新的阵列,而forEach不会。还记得以前在写JS时使用map都会搭配箭头函式做使用。而今天的Swift我们就要搭配Closure做使用,诶~你会发现他们两个都是匿名函式喔酷吧。
开始啰
我们先建立一个阵列
let numArray = [1,3,5,7,9]
接下来我们要使用map来达到让每个数都+1,并他放入新的阵列
numArray.map({ (num:Int)->Int in return num+1})
我们知道透过map我们可以将Array每个成员拿出来处理,而参数num就会依序收到每个成员再执行后面的动作,最后他会回传一个新的阵列,我们把它放入newArray的变数中
let newArray = numArray.map({ (num:Int)->Int in return num+1})print(newArray)// [2,4,6,8,10]
很简单对吧~~
哪泥~还可以简写!!
我们先根据上篇文章的内容进行简写,我们在重新建立一个新的阵列
let newArray2 = numArray.map({ (num:Int)->String in return "new number \(num)"
开始简写
若已经知道参数及回传值的型别的话,则可以删除closure内参数及回传值的型别根据上面的资讯我们知道了每次传入都是整数而会传的而也是字串。若程式码只有一行的情况下可以省略return,因为此时系统会帮你预设return很明显的他只有一行let newArray2 = numArray.map({ (num)in return "new number \(num)"
可以利用$0、$1、$2..,代替进去的参数名称let newArray2 = numArray.map({ (num) in "new number \(num)"
let newArray2 = numArray.map({ "new number \($0)"})print(newArray2)//["new number 1","new number 3","new number 5","new number 7","new number 9"]
还嫌太多~还能在简写吗?
没错是可以的,接下来我们要再介绍两个简写的条件及方法。
如果Closure是函式最后一个参数时则可以把它放到括号的后面。
我们很明显的可以观察到在map里面的函式是以Closure当作最后一个参数,所以我们可以将它放到括号的后面。let newArray2 = numArray.map(){ "new number \($0)" }
如果Closure是函式唯一的参数时则可以把小括号拿掉
如果Closure是函式唯一的参数除上述做法也把小括号拿掉let newArray2 = numArray.map{ "new number \($0)" }print(newArray2)// ["new number 1","new number 3","new number 5","new number 7","new number 9"]