iT邦幫忙

DAY 7
2

Swift - 從菜菜鳥到菜鳥的 30 天系列 第 7

[Swift-d7] - Playground - Closures

  • 分享至 

  • xImage
  •  

小弟的規劃表 - http://blog.kerkerj.in/blog/2014/11/01/planning/

好讀版 - http://blog.kerkerj.in/blog/2014/10/07/swift-d7/

閉包表達式語法:

{ (parameters) -> returnType in
statements
}

舉個例子:

func multiple(value: Int, multiple: Int -> Int) -> Int {
return multiple(value)
}

multiple(3, { (value) -> Int in
value * 3
})

在 multiple function 中需要傳入一個 function

在這邊我們並沒有另外定義,而是直接使用閉包的方式傳入一個 function

這個閉包就符合了上面的定義

根據上下文判斷型別 (Inferring type from context)

承上一個例子,我們可以寫得更簡潔一點

multiple(3, { value in
value * 3
})

這是因為 Swift 會根據兩邊的定義來判斷型別,因此可以寫得更簡潔一些

參數名稱縮寫, 運算子函式

直接看例子

func biggerThan0(value: Int, isBigger: Int -> Bool) -> Bool {
return isBigger(value)
}

biggerThan0(-1,
{ $0 > 0 }
)

尾隨閉包 (trailing closures)

通常如果閉包太長的話,可以把閉包接在括號後面:

func someFunc(closure: () -> ()) {
// main
}

someFunc({
// closure main
})

somFunc() {
// closure main
}

以上面的例子做例子:

func biggerThan0(value: Int, isBigger: Int -> Bool) -> Bool {
return isBigger(value)
}

biggerThan0(-1) { $0 > 0 }

如果是不需要參數的話,甚至可以把 () 省略掉

這邊直接參考一下別人的例子,是使用 array map 方法

下面要做的事情是

將 [16,58,510] 轉成 [「OneSix」, 「FiveEight」, 「FiveOneZero」]

let digitNames = [
0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]

let numbers = [16, 58, 510]

let strings = numbers.map {
(var number) -> String in
var output = ""
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return output
}

這個例子中,array 的 map 會用後面接的閉包,接連的處理陣列裡面的元素

所以最後 strings 的陣列就是處理過後的陣列

而處理的方法則是將 Int 的每個位數分別轉換成 String 連接起來再回傳

很方便的方法!


上一篇
[Swift-d6] - Playground - Function
下一篇
Playground - Enumerations
系列文
Swift - 從菜菜鳥到菜鳥的 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
henryfan
iT邦新手 5 級 ‧ 2014-10-13 10:42:48

Closures 真的是一個很奇妙的東西噎!而且使用起來真的很方便!

我要留言

立即登入留言