官术网_书友最值得收藏!

5.3 理解閉包結構

閉包結構對于編程初學者來說可能會難以理解,在學習閉包的過程中,讀者首先應該理解閉包的結構與實質。

5.3.1 閉包的語法結構

使用Xcode開發工具創建一個名為Closures的Playground文件,接下來將在其中進行代碼的演練。5.2節向讀者介紹了有關函數的內容,函數的設計思路是將有一定功能的代碼塊包裝在一起,通過函數名實現復用。閉包和函數有著類似的作用,然而閉包的設計大多數情況下并不是為了代碼的復用,而是傳遞功能代碼塊和處理回調結構。首先,一個完整的函數包含函數名、參數列表、返回值和函數體,示例如下:

     //標準函數,這個函數的功能是計算某個整數的平方
     func myFunc(param:Int)->Int{
        return param*param
     }

將上面函數的功能使用閉包來實現,代碼如下:

     //閉包的實現方式
     let myClosures = {(param:Int)->Int in
        return param*param
     }

上面的代碼創建了一個名為myClosures的閉包常量,閉包在語法上有這樣的標準結構:{(參數列表)->返回值in閉包體}。首先閉包的最外層由大括號包圍,內部由閉包關鍵字in來進行分割,關鍵字in前面為閉包結構的參數列表和返回值,其書寫規則與函數一致,關鍵字in后面為閉包體,用于實現具體功能。上面示例的閉包和函數原理上完全相同,并且閉包也可以像函數一樣被調用,示例代碼如下:

     //對函數進行調用,將返回9
     myFunc(param: 3)
     //對閉包進行調用,將返回9
     myClosures(3)

與函數不同的是,閉包的返回值是可以省略的,在閉包體中,如果有return返回,則閉包會自動將return的數據類型作為返回值類型,上面的閉包代碼也可以簡寫為如下樣式:

     //閉包的實現方式
     let myClosures = {(param:Int) in
        return param*param
     }

5.3.2 通過實現一個排序函數來深入理解閉包

在實踐中分析與解決問題是學習編程的一條捷徑。本小節將帶領讀者通過分析問題、探討解決方案、進行初步實現、優化實現方式等一步一步深入了解閉包的用法。學習這種分析解決問題的方式在編程中十分有益,其思路如圖5-1所示。

圖5-1 分析與解決問題的思路

在實際開發中,開發者經常會遇到不同的排序需求,例如按商品價格排序、按文章熱度排序、按消息時間先后排序、按學生成績排序等。很多情況下,開發者要排序的對象并不是簡單的數字類型值或者字符串類型值,而是自定義的復雜對象,也就是開發者常用的類。對于這種類型的排序需求,應該如何實現呢?首先應該明確需求問題,如下:

(1)應該實現一個函數來對數組類型排序。

(2)數組中的元素可以是任意的復雜類型。

實現根據復雜類型數據中的某一個屬性進行排序,例如學生的成績。

(1)針對上面提出的需求問題,設計初步的實現思路。

(2)以通用的數組類型作為函數的參數。

若要實現對自定義復雜類型的排序操作,則需要將排序算法作為參數傳入函數。

編寫函數的結構示例如下:

提示

Any在Swift語言中代表任意類型。

mySort()函數中需要傳入兩個參數,一個是要進行排序的數組數據,另一個是一個閉包排序方法,這個閉包有兩個Any類型的參數,表示數組中兩個相鄰的元素。第1個參數表示前一個元素,第2個參數表示后一個元素,這個閉包有一個Bool類型的返回值,返回true則表示正向排序,即參數中的第1個元素和第2個元素不交換位置,返回false表示逆向排序,即參數中的第1個元素和第2個元素交換位置。之后,根據上面的分析來對mySort函數進行實現,代碼如下:

如以上代碼所示,使用了冒泡排序算法來進行排序操作,而具體兩個元素的排序規則是由閉包sortClosure來實現的。swapAt()函數是Swift語言中的一個交換函數,用來實現數組元素的交換,由于需要對原數組數據進行操作,因此需要使用inout類型的數組參數。

先使用整型數組來對編寫的排序函數進行測試,代碼如下:

提示

as!的作用是類型轉換。

編寫一個自定義的類來進行排序測試,示例如下:

以上代碼模擬了一個學生類,每一個學生對象由名字和分數組成,閉包實現了對學生分數的排序規則。

提示

上面的代碼在定義學生類的時候遵守了CustomStringConvertible協議,實現這個協議的description方法可以自定義類對象的打印信息,在代碼調試時非常好用。

主站蜘蛛池模板: 安陆市| 丰都县| 平昌县| 六盘水市| 咸宁市| 延长县| 漠河县| 曲靖市| 和硕县| 扎赉特旗| 平顶山市| 射阳县| 奉贤区| 麻栗坡县| 三都| 苏尼特右旗| 渭源县| 黄浦区| 姜堰市| 嘉兴市| 牡丹江市| 十堰市| 乌审旗| 尚义县| 台南县| 德令哈市| 星子县| 翁牛特旗| 军事| 浪卡子县| 全州县| 东至县| 宣化县| 长武县| 辽阳市| 青岛市| 永顺县| 文水县| 汉源县| 黄石市| 古浪县|