日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

初探swift语言的学习笔记三(闭包-匿名函数)

發布時間:2024/9/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初探swift语言的学习笔记三(闭包-匿名函数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 轉載請注明出處 如果覺得文章對你有所幫助,請通過留言或關注微信公眾帳號fengsh998來支持我,謝謝!


很多高級語言都支持匿名函數操作,在OC中的block也為大家所熟悉,然面在swift里好像是被重新作了一個定義,不叫匿名函數,或block了,而叫閉包(closure)。下面配合代碼來理解一下swift的閉包強大之處。使用系統的一個sort排序方法來演示一下閉包的使用,引用官網的事例

[cpp]?view plaincopy
  • //閉包(即匿名函數或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)??

  • 輸出:

    [cpp]?view plaincopy
  • [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]??

  • 通過這些例子,可以看到swift的強大的編譯及對代碼的理解,只要代碼足夠清晰,沒有歧義,就可以最大限度的省寫一些代碼,這樣雖然減少了開發者的編碼,同時代碼的靈活情寫法也有了大幅的提升,一定的范圍內,對初學者的適應能力加大了。要寫出更省更優的代碼質量,我想是必要把各種可能認知到一個很高的深度。其實我很好期像

    [cpp]?view plaincopy
  • func?backwards(s1:?String,?s2:?String)?->?Bool?{??
  • ????return?s1?>?s2??
  • }??
  • //使用自定義函數進行排序??
  • var?reversed?=?sort(names,?backwards)??

  • [cpp]?view plaincopy
  • des?=?sort(names,>)??
  • ????????println(des)??

  • 這兩個是實現同一功能,但代碼的編寫量卻相差較大,這是其一,其二,我想信這兩個在編譯時,計算機對代碼的理解時間上也不一樣,對于第一種比較清楚,計算機可能很快就認知,少了很多檢查編譯和驗證,第二種,可能計算機要花少少時間來從names中推斷各種可能后最終得到一個沒有歧義的結果后才繼續編譯,其三,這兩個在運行其運行效率是一樣的嗎?其四,讀者的閱讀上帶來了一定的難度。就像光看一個>號,可能一下還不知道這是干嘛用的。但如果第一種情況就很好的知道是想干什么。

    總而言之,swift的閉包有優也有略,大家在編碼中就取其之長避其之短吧。當然什么是長,什么是短,讀者自己定義了。

    總結

    以上是生活随笔為你收集整理的初探swift语言的学习笔记三(闭包-匿名函数)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。