iT邦幫忙

0

IOS Swift 還能更精簡? Closure的其它用法你一定要知道!!

前言:

屁屁痛了一整晚昨天全程跪著打文章,都這樣了你們該進來看一下了吧,順帶一提如果有對Swift其他主題或功能感興趣的話,可以在下面留言讓我知道,我會查資料並整理給大家,今天剛吃完早餐沒什麼要抱怨的..,那就直接開始吧。
https://ithelp.ithome.com.tw/upload/images/20210423/20136753dDzHXBLfZM.jpg


上次

上次我們聊完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)"

開始簡寫
  1. 若已經知道參數及回傳值的型別的話,則可以刪除closure內參數及回傳值的型別
    • 根據上面的資訊我們知道了每次傳入都是整數而會傳的而也是字串。
    let newArray2 = numArray.map({
       (num)in
       return "new number \(num)"
    
  2. 若程式碼只有一行的情況下可以省略return,因為此時系統會幫你預設return
    • 很明顯的他只有一行
    let newArray2 = numArray.map({
     (num) in "new number \(num)"
    
  3. 可以利用$0、$1、$2..,代替進去的參數名稱
let newArray2 = numArray.map({
  "new number \($0)"
})
print(newArray2)
//["new number 1","new number 3","new number 5","new number 7","new number 9"] 

還嫌太多~還能在簡寫嗎?

沒錯是可以的,接下來我們要再介紹兩個簡寫的條件及方法。

  1. 如果Closure是函式最後一個參數時則可以把它放到括號的後面。

    • 我們很明顯的可以觀察到在map裡面的函式是以Closure當作最後一個參數,所以我們可以將它放到括號的後面。
    let newArray2 = numArray.map(){  "new number \($0)" }
    
  2. 如果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"] 
    

Closure還有許多用途,目前Closure部分先整理到這篇,下次見囉~~


尚未有邦友留言

立即登入留言