激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Swift - Swift 3.0基礎學習之閉包

Swift 3.0基礎學習之閉包

2021-01-03 17:06Mellong Swift

Swift引進了閉包的概念,這個與object-c的block類似,使用過block的話都知道有多方便,所以開始學Swift,先要把閉包學會,后面使用會很頻繁。下面這篇文章主要介紹了Swift 3.0基礎學習之閉包的相關資料,需要的朋友可以參考借鑒,下

前言

閉包是功能性自包含模塊,可以在代碼中被傳遞和使用。 Swift 中的閉包與 C 和 Objective-C中的 blocks 以及其他一些編程語言中的 lambdas 比較相似。下面這篇文章就來詳細介紹了關于Swift 3.0中的閉包,感興趣的一起來看看吧。

開始

閉包的書寫格式如下:

?
1
2
3
{ (parameters) -> return type in
statements
}

?
1
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )

使用的時候可以簡化為

?
1
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

也可以簡化為

?
1
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

甚至可以簡化為

?
1
reversedNames = names.sorted(by: { $0 > $1 } )

$0為第一個參數,以此類推

返回布爾值的話可以直接給一個判斷符號,如

?
1
reversedNames = names.sorted(by: >)

尾部閉包

?
1
reversedNames = names.sorted() { $0 > $1 }

或者(無其他參數的情況下)

?
1
reversedNames = names.sorted { $0 > $1 }

這兩個方式均可

捕捉值

如下代碼,閉包可以獲取和修改其周圍的變量

?
1
2
3
4
5
6
7
8
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
 var runningTotal = 0
 func incrementer() -> Int {
 runningTotal += amount
 return runningTotal
 }
 return incrementer
}

以上函數返回一個閉包,閉包里添加了讀取和修改閉包的外部變量runningTotal

?
1
2
3
4
5
6
7
let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen()
// returns a value of 10
incrementByTen()
// returns a value of 20
incrementByTen()
// returns a value of 30

閉包引用類型

可以通過用這種方式引用閉包并且調用:

?
1
2
let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()

@escaping

傳遞給函數的閉包如果不是在函數內調用,而是在函數內用外部變量保存當前的閉包,在合適的時間再進行調用,這是就需要在閉包參數前加入@escaping關鍵字,不然編譯器會報錯。

比較好理解的就是經常用到的網絡請求,請求完成才執行完成的閉包。

官方的例子如下:

?
1
2
3
4
5
6
7
8
9
//需要加@escaping的情況
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
 completionHandlers.append(completionHandler)
}
//直接在函數內調用傳入的閉包則不需要@escaping
func someFunctionWithNonescapingClosure(closure: () -> Void) {
 closure()
}

@autoclosure 自動閉包

?
1
2
3
4
5
6
// customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: () -> String) {
 print("Now serving \(customerProvider())!")
}
serve(customer: { customersInLine.remove(at: 0) } )
// Prints "Now serving Alex!"

如上代碼所示,我們加入一個返回類型為String的閉包,需要在外面加上{},為了書寫方便, 加上@autoclosure關鍵字,那么這個對{}就可以省略了。

?
1
2
3
4
5
6
// customersInLine is ["Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: @autoclosure () -> String) {
 print("Now serving \(customerProvider())!")
}
serve(customer: customersInLine.remove(at: 0))
// Prints "Now serving Ewa!"

編譯器會幫我們標記這行代碼為閉包,這段代碼不會馬上被調用,而是當成閉包在函數里調用的時候才被調用。

參考英語原文:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者使用Swift能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://devlong.com/2016/11/06/closures/

延伸 · 閱讀

精彩推薦
  • SwiftSwift能代替Objective-C嗎?

    Swift能代替Objective-C嗎?

    這是我在網上上看到的答案,復制粘貼過來和大家分享一下,因為我和很多人一樣很關心Swift的出現對Mac開發的影響和對Objective-C的影響。...

    Swift教程網4412020-12-16
  • SwiftSwift中轉義閉包示例詳解

    Swift中轉義閉包示例詳解

    在Swift 中的閉包類似于結構塊,并可以在任何地方調用,下面這篇文章主要給大家介紹了關于Swift中轉義閉包的相關資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
  • SwiftSwift的74個常用內置函數介紹

    Swift的74個常用內置函數介紹

    這篇文章主要介紹了Swift的74個常用內置函數介紹,這篇文章列舉出了所有的Swift庫函數,內置函數是指無需引入任何模塊即可以直接使用的函數,需要的朋友可...

    Swift教程網5802020-12-19
  • Swiftswift where與匹配模式的實例詳解

    swift where與匹配模式的實例詳解

    這篇文章主要介紹了swift where與匹配模式的實例詳解的相關資料,這里附有簡單的示例代碼,講的比較清楚,需要的朋友可以參考下...

    追到夢的魔術師14382021-01-06
  • SwiftSwift教程之基礎數據類型詳解

    Swift教程之基礎數據類型詳解

    這篇文章主要介紹了Swift教程之基礎數據類型詳解,本文詳細講解了Swift中的基本數據類型和基本語法,例如常量和變量、注釋、分號、整數、數值類型轉換等...

    Swift教程網5162020-12-18
  • Swiftmac git xcrun error active developer path 錯誤

    mac git xcrun error active developer path 錯誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環境時,出現了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助...

    Swift教程網2232020-12-16
  • SwiftSwift使用CollectionView實現廣告欄滑動效果

    Swift使用CollectionView實現廣告欄滑動效果

    這篇文章主要為大家詳細介紹了Swift使用CollectionView實現廣告欄滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Stevin的技術博客12372021-01-13
  • SwiftSwift實現多個TableView側滑與切換效果

    Swift實現多個TableView側滑與切換效果

    這篇文章主要為大家詳細介紹了Swift實現多個TableView側滑與切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    乞力馬扎羅的雪雪5822021-01-08
主站蜘蛛池模板: 中文字幕在线观看网址 | 精品国产一区二区三区四区在线 | 美女黄视频在线观看 | 黄色成人在线播放 | 国产美女做爰免费视 | 国产高潮好爽好大受不了了 | 亚洲人成在线播放网站 | 羞羞视频免费网站男男 | 久久国产精品99国产 | 免费h片| 国产88久久久国产精品免费二区 | 日韩精品久久久久久久电影99爱 | 欧美日韩国产成人在线观看 | 免费毛片儿 | 国产精品99免费视频 | 成人毛片免费视频 | 免费观看黄色片视频 | 欧洲黄色一级视频 | 久久免费视频8 | 久久男人视频 | 欧美特黄特色视频 | 国产精品久久久久久久成人午夜 | 51国产偷自视频区视频小蝌蚪 | 亚洲小视频| 人成免费a级毛片 | 国产精品成人久久 | 国产91av视频 | 在线免费观看麻豆 | 久久99在线 | 日韩a毛片免费观看 | 在线观看国产日韩 | 91免费在线 | 欧美毛片免费观看 | 婷婷一区二区三区 | 欧美一级美国一级 | 免费观看在线 | 欧美女孩videos | 久久精品国产清自在天天线 | 久久久久久久久91 | 成人区一区二区三区 | 天堂成人一区二区三区 |