Swift學習之每日一tip (3)閉包

閉包介紹

最近在學習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)")
    // ...
}

這麼簡單的過程,相信小夥伴們應該都不需要我再多廢話了吧,今天就到這裏,明天再見。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章