初探swift语言的学习笔记三(闭包-匿名函数)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                初探swift语言的学习笔记三(闭包-匿名函数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            作者:fengsh998
 
 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019
 
 轉載請注明出處
 
 如果覺得文章對你有所幫助,請通過留言或關注微信公眾帳號fengsh998來支持我,謝謝!
 
 
 //閉包(即匿名函數或OC中的block塊函)??  ????????let?names?=?["Chris",?"Alex",?"Ewa",?"Barry",?"Daniella"]??  ????????//默認輸出升序排序??  ????????println(sort(names))??  ??????????  ????????func?backwards(s1:?String,?s2:?String)?->?Bool?{??  ????????????return?s1?>?s2??  ????????}??  ????????//使用自定義函數進行排序??  ????????var?reversed?=?sort(names,?backwards)??  ????????println(reversed)??  ??????????  ????????//使用閉包({?(s1:?String,?s2:?String)?->?Bool?in?return?s1?>?s2?})函數進行排序??  ????????var?desc?=?sort(names,?{?(s1:?String,?s2:?String)?->?Bool?in?return?s1?>?s2?}?)??  ????????println(desc)??  ??????????  ????????//因為可以從names中推斷出元素類型為String?因此閉包可以直接省去->?Bool??  ????????var?des?=?sort(names,?{?s1,?s2?in?return?s1?>?s2?}?)??  ????????println(des)??  ????????//此外,swift中還可以從閉包中S1>S2,只有單的一表達式,可推斷了結果是BOOL值??  ????????//在這種沒有歧義的情況下,可以省去return??  ????????des?=?sort(names,?{?s1,?s2?in?s1?>?s2?}?)??  ????????println(des)??  ??????????  ????????//還可以使用速記參數名??  ????????des?=?sort(names,?{?$0?<?$1?}?)??  ????????println(des)??  ??????????  ????????//還可以直接使用運算符來排序??  ????????des?=?sort(names,>)??  ????????println(des)??  
 
輸出: [Alex,?Barry,?Chris,?Daniella,?Ewa]??  [Ewa,?Daniella,?Chris,?Barry,?Alex]??  [Ewa,?Daniella,?Chris,?Barry,?Alex]??  [Ewa,?Daniella,?Chris,?Barry,?Alex]??  [Ewa,?Daniella,?Chris,?Barry,?Alex]??  [Alex,?Barry,?Chris,?Daniella,?Ewa]??  [Ewa,?Daniella,?Chris,?Barry,?Alex]??  
 
 
 func?backwards(s1:?String,?s2:?String)?->?Bool?{??  ????return?s1?>?s2??  }??  //使用自定義函數進行排序??  var?reversed?=?sort(names,?backwards)??  
 
和 des?=?sort(names,>)??  ????????println(des)??  
 
這兩個是實現同一功能,但代碼的編寫量卻相差較大,這是其一,其二,我想信這兩個在編譯時,計算機對代碼的理解時間上也不一樣,對于第一種比較清楚,計算機可能很快就認知,少了很多檢查編譯和驗證,第二種,可能計算機要花少少時間來從names中推斷各種可能后最終得到一個沒有歧義的結果后才繼續編譯,其三,這兩個在運行其運行效率是一樣的嗎?其四,讀者的閱讀上帶來了一定的難度。就像光看一個>號,可能一下還不知道這是干嘛用的。但如果第一種情況就很好的知道是想干什么。
                        
                        
                        
 
 
很多高級語言都支持匿名函數操作,在OC中的block也為大家所熟悉,然面在swift里好像是被重新作了一個定義,不叫匿名函數,或block了,而叫閉包(closure)。下面配合代碼來理解一下swift的閉包強大之處。使用系統的一個sort排序方法來演示一下閉包的使用,引用官網的事例
[cpp]?view plaincopy
輸出:
[cpp]?view plaincopy
通過這些例子,可以看到swift的強大的編譯及對代碼的理解,只要代碼足夠清晰,沒有歧義,就可以最大限度的省寫一些代碼,這樣雖然減少了開發者的編碼,同時代碼的靈活情寫法也有了大幅的提升,一定的范圍內,對初學者的適應能力加大了。要寫出更省更優的代碼質量,我想是必要把各種可能認知到一個很高的深度。其實我很好期像
[cpp]?view plaincopy
和
[cpp]?view plaincopy
這兩個是實現同一功能,但代碼的編寫量卻相差較大,這是其一,其二,我想信這兩個在編譯時,計算機對代碼的理解時間上也不一樣,對于第一種比較清楚,計算機可能很快就認知,少了很多檢查編譯和驗證,第二種,可能計算機要花少少時間來從names中推斷各種可能后最終得到一個沒有歧義的結果后才繼續編譯,其三,這兩個在運行其運行效率是一樣的嗎?其四,讀者的閱讀上帶來了一定的難度。就像光看一個>號,可能一下還不知道這是干嘛用的。但如果第一種情況就很好的知道是想干什么。
總而言之,swift的閉包有優也有略,大家在編碼中就取其之長避其之短吧。當然什么是長,什么是短,讀者自己定義了。
總結
以上是生活随笔為你收集整理的初探swift语言的学习笔记三(闭包-匿名函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 初探swift语言的学习笔记二(可选类型
- 下一篇: 初探swift语言的学习笔记四-2(对上
