閉包介紹
最近在學習swift的過程中,發現很多人都對於swift的閉包有很深的疑惑,今天就以我個人學習swift 1.2版本下的一些經驗進行一些分享,如有錯漏,望大家指出。
ps.《關於Swift學習之每日一tip》我這段時間會持續更新,而其中關於swift的內容都是在今年(2014)春節之後,蘋果推出Xcode6.3測試版的之後推出的swift 1.2的語法,關於1.2與1.1的語法,我會在明天的內容中進行一下介紹。
通用閉包
首先,給大家寫一段常見的閉包代碼
demo{ (name) -> () in
println("\(name): 完成了嗎?")
}
上面這個閉包實際上是閉包的一個回調,下面寫出準備好的閉包的內容
func demo(finished:(name: String)->()) {
println("小明正在玩命工作中... ")
// 執行閉包,完成耗時操作後,做回調
let t = "大 BOSS"
finished(name: t)
}
執行結果:
小明正在玩命工作中...
大 BOSS: 完成了嗎?
以上就是一個最常用的閉包,在這裏,閉包實際上與Objective-c中的Block定義非常相似,都是先定義出後面準備好的閉包的內容,然後再在我們需要的地方進行閉包的調用,即可。
大家理解了閉包的原理之後,我們再來分析這段閉包代碼。
// 閉包的格式
/**
{ (參數) -> (返回值) in
代碼實現
}
*/
大家在初學閉包的時候,可以比照着這個格式來看閉包的調用,因爲一般在調用的時候,閉包會更加的直觀。
- 在上面這段代碼中,在回調時,我們打印了一句話,傳入了一個閉包內部定義好的名字。
- 而在閉包的準備內容中,我們可以看到,在這裏,實際上可以看做是C++或者其他高級語言中的函數,而我們的閉包實際上是一個參數。
- 在這個函數內部,我們在需要的地方,進行閉包的調用。
- 然後,我們再在其他需要執行這個函數的地方進行回調代碼,傳入我們在回調時想要得到的效果。
- 整個過程實際上就是代理設計模式的設計思路,這在蘋果的ios開發中,非常常見,具體可以參照Objective-c中的代理和Block
不知道通過上面的這些內容,大家對於閉包有沒有一個初步的認識?
下面介紹一下閉包的一種常見簡化寫法:
尾隨閉包
實際上,第一次看到尾隨閉包的時候,我並沒有意識到這是一個閉包,因爲他太簡單了,簡單到什麼程度?
demo2 {
println("over"
}
對,你沒看錯,就是這樣。這就是一個尾隨閉包的調用。
實際上,他的完整版應該是這樣的:
demo2 { () -> () in
println("over")
}
看到這裏,相信聰明的同學已經猜出來了,這個尾隨閉包顧名思義,如果閉包是最後一個參數,可以進行簡化,當這個閉包裏連參數都沒有的話,我們就可以像上面那樣寫出如此簡單的閉包調用。
在這裏我們定義一下這個閉包:
func demo2(completion:()->()) {
// 執行耗時操作
println("耗時操作")
// 回調
completion()
}
這個閉包就是符合我上面所說的閉包是最後一個參數,同時閉包裏連參數都沒有。
當然尾隨閉包只需要閉包是最後一個參數的情況下就可以進行簡寫,這裏就不寫了,因爲本人並不推薦那樣的寫法,可讀性太差了!!
最後,我再簡單說一下閉包的返回值:
閉包的返回值
廢話不多說,上代碼:
// 閉包的返回值
demo3 { () -> Int in
return 10
}
在這裏,大家似乎應該都發現了,我在寫代碼的時候都喜歡先寫調用,再寫閉包的內容,這裏當然是爲了大家方便理解,拋開語法的束縛,不喜勿噴喲~^_^。
下面是閉包的定義:
func demo3(rowCount:()->Int) {
// 通過閉包的返回值,獲得數據信息
let count = rowCount()
println("行數 \(count)")
// ...
}
這麼簡單的過程,相信小夥伴們應該都不需要我再多廢話了吧,今天就到這裏,明天再見。