日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Swift 閉包的多種形式:包括閉包表達式、尾隨閉包、逃逸閉包等

來源: 責編: 時間:2024-01-22 17:25:15 290觀看
導讀本文我們將介紹 Swift 中閉包表達式、尾隨閉包和逃逸閉包等相關的內容。如果你尚未安裝 Xcode 和配置 Swift 開發環境,請您先閱讀這篇文章。接下來,我們啟動 Xcode,然后選擇 "File" > "New" > "Playground"。創建一個新

ZqM28資訊網——每日最新資訊28at.com

本文我們將介紹 Swift 中閉包表達式、尾隨閉包和逃逸閉包等相關的內容。如果你尚未安裝 Xcode 和配置 Swift 開發環境,請您先閱讀這篇文章。ZqM28資訊網——每日最新資訊28at.com

接下來,我們啟動 Xcode,然后選擇 "File" > "New" > "Playground"。創建一個新的 Playground 并命名為 "Closures"。ZqM28資訊網——每日最新資訊28at.com

在 Swift 中,閉包是自包含的功能塊,可以捕獲和存儲上下文中任意常量和變量的引用。Swift 閉包有多種形式,包括閉包表達式、尾隨閉包、逃逸閉包等。ZqM28資訊網——每日最新資訊28at.com

閉包表達式

閉包表達式語法

閉包表達式是一種輕量級語法,用于表示內聯閉包。它的語法如下:ZqM28資訊網——每日最新資訊28at.com

{ (parameters) -> returnType in    // Closure body}

相關說明如下:ZqM28資訊網——每日最新資訊28at.com

  • parameters:定義了閉包的參數列表。
  • returnType:定義了閉包的返回類型。
  • in:用于分隔參數列表和閉包體。

創建閉包

了解了閉包表達式的語法之后,我們來創建一個閉包。ZqM28資訊網——每日最新資訊28at.com

Swift CodeZqM28資訊網——每日最新資訊28at.com

// 定義一個閉包,它接受兩個參數并返回它們的總和let addClosure: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in    return a + b}// 調用 addClosure 閉包let sum = addClosure(2, 3)print("Sum: /(sum)")// Output: Sum: 5

在以上例子中,addClosure 是一個接受兩個整數參數并返回它們和的閉包。在閉包表達式中,Swift 可以根據上下文推斷參數類型和返回類型,因此通常可以省略它們:ZqM28資訊網——每日最新資訊28at.com

let addClosure: (Int, Int) -> Int = { a, b in    return a + b}

如果閉包體只包含一條語句,可以省略 return 關鍵字:ZqM28資訊網——每日最新資訊28at.com

let addClosure: (Int, Int) -> Int = { a, b in a + b }

在 Swift 的閉包表達式中,$0$1 等是用來表示閉包參數的縮寫形式。這種縮寫形式允許在閉包表達式中直接引用參數,而不需要顯式地命名。所以,以上的代碼,還可以繼續簡化:ZqM28資訊網——每日最新資訊28at.com

let addClosure: (Int, Int) -> Int = { $0 + $1 }

下面,我們來看一下等價的 TypeScript 代碼。ZqM28資訊網——每日最新資訊28at.com

TypeScript CodeZqM28資訊網——每日最新資訊28at.com

const addClosure: (a: number, b: number) => number = (a, b) => {    return a + b;};const sum: number = addClosure(2, 3);console.log(`Sum: ${sum}`); // Output: "Sum: 5"

閉包作為函數參數

閉包可以作為函數的參數,使得函數更加靈活。ZqM28資訊網——每日最新資訊28at.com

Swift CodeZqM28資訊網——每日最新資訊28at.com

func performOperation(_ operation: (Int, Int) -> Int, a: Int, b: Int) {    let result = operation(a, b)    print("Result: /(result)")}performOperation({ (a: Int, b: Int) -> Int in    return a + b}, a: 2, b: 3)// Output:Result: 5

TypeScript CodeZqM28資訊網——每日最新資訊28at.com

function performOperation(operation: (a: number, b: number) => number, a: number, b: number): void {    const result: number = operation(a, b);    console.log(`Result: ${result}`);}performOperation((a: number, b: number) => {    return a + b;}, 2, 3);// Output: "Result: 5"

閉包作為排序函數的參數

Swift CodeZqM28資訊網——每日最新資訊28at.com

let numbers = [4, 2, 8, 5, 1]// 使用尾隨閉包let sortedNumbers = numbers.sorted { $0 < $1 }print(sortedNumbers)// Output: [1, 2, 4, 5, 8]

TypeScript CodeZqM28資訊網——每日最新資訊28at.com

const numbers: number[] = [4, 2, 8, 5, 1];const sortedNumbers: number[] = numbers.sort((a, b) => a - b);console.log(sortedNumbers);// Output: [1, 2, 4, 5, 8]

在閉包中捕獲值

在 Swift 中,閉包可以捕獲并存儲它們定義時所在上下文中的常量和變量。即使定義這些常量和變量的原始上下文已經不存在,閉包仍然可以引用和修改這些值。下面我們來舉一個閉包捕獲外部函數的局部變量的示例:ZqM28資訊網——每日最新資訊28at.com

Swift CodeZqM28資訊網——每日最新資訊28at.com

func makeIncrementer(forIncrement amount: Int) -> () -> Int {    var runningTotal = 0    let incrementer: () -> Int = {        runningTotal += amount        return runningTotal    }    return incrementer}let incrementByTen = makeIncrementer(forIncrement: 10)print(incrementByTen()) // Output: 10print(incrementByTen()) // Output: 20

在以上代碼中,incrementByTen 是一個閉包,它捕獲了 makeIncrementer 函數內的 runningTotal  amount 變量。即使 makeIncrementer 函數的執行已經完成,這些捕獲的變量仍然存在于閉包內。ZqM28資訊網——每日最新資訊28at.com

在 JavaScript 中,函數可以訪問定義它們的函數的作用域中的變量。這個特性被稱為詞法作用域或靜態作用域。雖然 JavaScript 沒有專門的閉包語法,但函數本身就表現出閉包的行為。ZqM28資訊網——每日最新資訊28at.com

TypeScript CodeZqM28資訊網——每日最新資訊28at.com

function makeIncrementer(amount: number): () => number {    let runningTotal = 0;    return function(): number {        runningTotal += amount;        return runningTotal;    }}const incrementByTen = makeIncrementer(10);console.log(incrementByTen()); // Output: 10console.log(incrementByTen()); // Output: 20

尾隨閉包

尾隨閉包(Trailing Closures)在 Swift 中是一個非常有用的特性,尤其是當閉包作為函數的最后一個參數時。尾隨閉包語法使得在函數調用時將閉包寫在函數括號之外,使得代碼更加清晰。ZqM28資訊網——每日最新資訊28at.com

let result = someFunction(arg1, arg2) { parameter in    // 閉包體}

Swift CodeZqM28資訊網——每日最新資訊28at.com

func applyOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {    return operation(a, b)}// Calling a function using a trailing closurelet result = applyOperation(2, 3) { $0 + $1 }print("Result: /(result)") // Output: Result: 5

在以上示例中,applyOperation 函數接受兩個整數和一個閉包作為參數。使用尾隨閉包語法,我們可以將閉包寫在函數調用的括號之外,使得代碼更加簡潔。在 TypeScript 中,并沒有直接的尾隨閉包語法,但可以通過將函數的最后一個參數定義為函數類型來達到類似的效果。ZqM28資訊網——每日最新資訊28at.com

TypeScript CodeZqM28資訊網——每日最新資訊28at.com

function applyOperation(a: number, b: number, operation: (a: number, b: number) => number): number {    return operation(a, b);}const result: number = applyOperation(2, 3, (a, b) => a + b);console.log(`Result: ${result}`);// Output: "Result: 5"

逃逸閉包

逃逸閉包(Escaping Closures)是一個重要的概念,特別是在處理異步操作和回調時。逃逸閉包與非逃逸閉包的主要區別在于它們的生命周期:逃逸閉包可以在函數返回之后被調用,而非逃逸閉包則必須在函數返回之前被調用。逃逸閉包是在函數執行完畢后才被調用的閉包。在參數列表前加上 @escaping 關鍵字表示該閉包逃逸。ZqM28資訊網——每日最新資訊28at.com

Swift CodeZqM28資訊網——每日最新資訊28at.com

import Foundationfunc loadData(completionHandler: @escaping (String) -> Void) {    // 模擬異步操作    DispatchQueue.global().async {        let data = "Hello, Escaping closures!"        DispatchQueue.main.async {            completionHandler(data)        }    }}loadData { data in    print("Received: /(data)")}// Output: Received: Hello, Escaping closures!

在以上示例中,completionHandler 是一個逃逸閉包,因為它在函數返回之后的某個時間點被調用。在 TypeScript 中,雖然并沒有專門的逃逸閉包的語法,但我們可以通過傳遞函數作為參數,并在異步操作完成后調用該函數來模擬逃逸閉包的效果。ZqM28資訊網——每日最新資訊28at.com

TypeScript CodeZqM28資訊網——每日最新資訊28at.com

function loadData(): Promise<string> {    return new Promise((resolve) => {        // 模擬異步操作        setTimeout(() => {            const data = "Hello, Closures!";            resolve(data);        }, 1000);    });}loadData().then(data => {    console.log(`Received: ${data}`);});// Output: "Received: Hello, Closures!"

Swift 的逃逸閉包和 TypeScript 的異步操作處理都是處理延時執行、異步執行的強大工具。它們都允許函數在完成某些操作后再執行一些代碼,這在處理網絡請求、數據庫操作等異步任務時非常有用。ZqM28資訊網——每日最新資訊28at.com

本文我們介紹了 Swift 中閉包表達式、尾隨閉包和逃逸閉包等相關的內容。通過與 TypeScript 語法的對比,希望能幫助您更好地理解 Swift 的相關特性。ZqM28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-66199-0.htmlSwift 閉包的多種形式:包括閉包表達式、尾隨閉包、逃逸閉包等

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 聊聊我所理解的平臺工程

下一篇: 走過近30年:Java外表成熟,內心依舊少年

標簽:
  • 熱門焦點
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現已正式出爐,冠軍是來自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法。可以用來發現應用程序、操作系統和網絡協議等中的漏洞或
  • 零售大模型“干中學”,攀爬數字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標。攀登珠峰的商業路線有兩條,一是尼泊爾境內的南坡路線,一是中國境內的北坡路線。相
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 華為發布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發者大會2023(HDC.Together)大會上,HarmonyOS 4正式發布。自2019年發布以來,HarmonyOS一直以用戶為中心,經歷四年多的發展HarmonyOS已
  • 華為和江淮汽車合作開發百萬元問界MPV?雙方回應來了

    8月1日消息,郭明錤今天在社交平臺發文稱,華為正在和江淮汽車合作,開發售價在100萬元的問界MPV,預計在2024年第2季度量產,銷量目標為上市首年交付5萬輛。
  • 聯想YOGA 16s 2022筆記本將要推出,屏幕支持觸控功能

    聯想此前宣布,將于11月2日19:30召開聯想秋季輕薄新品發布會,推出聯想 YOGA 16s 2022 筆記本等新品。官方稱,YOGA 16s 2022 筆記本將搭載 16 英寸屏幕,并且是一
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲精品美女久久久久| 国产精品护士白丝一区av| 欧美专区中文字幕| 久久久久久久综合| 亚洲作爱视频| 亚洲制服欧美中文字幕中文字幕| 亚洲国产精品成人综合| 国产日本欧美在线观看 | 久久永久免费| 久热re这里精品视频在线6| 欧美激情久久久久| 国产精品久久久久久久app| 欧美日韩卡一卡二| 国产色综合久久| 亚洲人www| 亚洲精品日韩精品| 午夜精品一区二区三区电影天堂| 亚洲欧美日韩高清| 久久一区欧美| 欧美午夜精品电影| 激情一区二区| 中文一区字幕| 卡通动漫国产精品| 国产精品日韩精品欧美精品| 亚洲成人在线免费| 亚洲国产欧美一区二区三区久久| 亚洲国产精品久久久久婷婷884| 精东粉嫩av免费一区二区三区| 伊人精品成人久久综合软件| 激情久久五月天| 一区二区三区国产精华| 久久精品亚洲一区二区三区浴池| 久久综合国产精品| 国产精品www色诱视频| 在线免费观看日本欧美| 亚洲综合精品| 久久精品国产欧美激情| 欧美日韩久久| 在线看欧美视频| 午夜国产精品影院在线观看| 免费成人黄色片| 国产伦精品一区二区三区在线观看| 国产视频精品xxxx| 亚洲美女在线国产| 久久久久久久999精品视频| 国产精品久久久| 国产一区二区高清| 一区二区黄色| 欧美成人综合| 黑人巨大精品欧美黑白配亚洲| 亚洲国产美女久久久久| 先锋影音国产精品| 欧美日韩一区二区国产| 亚洲国产欧美国产综合一区| 久久精品一区| 欧美喷潮久久久xxxxx| 精品99视频| 欧美一区二区精美| 欧美少妇一区| 日韩视频永久免费| 另类欧美日韩国产在线| 国产午夜精品美女视频明星a级| 亚洲国产aⅴ天堂久久| 欧美亚洲一级片| 国产精品久久久久999| 欧美激情一区二区在线| 韩国av一区二区三区四区| 亚洲美女少妇无套啪啪呻吟| 久久精品国产77777蜜臀| 国产精品伦理| 中文日韩在线视频| 欧美三级视频在线| 亚洲人成欧美中文字幕| 蜜桃av噜噜一区| 黄色成人免费观看| 久久久久这里只有精品| 国产亚洲视频在线| 欧美一区二区精品在线| 国产精品毛片大码女人| 亚洲视频一二三| 欧美无乱码久久久免费午夜一区| 韩日精品在线| 久久riav二区三区| 国产三级欧美三级| 欧美与黑人午夜性猛交久久久| 欧美肥婆bbw| 亚洲国产精品欧美一二99| 另类av一区二区| 亚洲高清激情| 性久久久久久久| 欧美另类变人与禽xxxxx| 亚洲日韩视频| 欧美日韩国产综合网| 亚洲桃花岛网站| 国产精品视频精品| 香蕉乱码成人久久天堂爱免费| 欧美精品尤物在线| 在线电影欧美日韩一区二区私密| 亚洲午夜91| 国产欧美日韩免费看aⅴ视频| 日韩午夜黄色| 欧美色欧美亚洲高清在线视频| 亚洲激情精品| 欧美精品日韩精品| 亚洲深夜激情| 国产亚洲人成a一在线v站 | 欧美激情精品久久久久久久变态| 国产亚洲欧美另类一区二区三区| 夜夜嗨网站十八久久| 国产精品vip| 欧美在线影院在线视频| 亚洲电影免费在线| 欧美精品久久一区| 亚洲夜间福利| 国产一区高清视频| 免费视频亚洲| 一本一本久久a久久精品综合麻豆| 欧美99在线视频观看| 国产又爽又黄的激情精品视频| 亚洲免费一在线| 国产自产在线视频一区| 欧美波霸影院| 亚洲一区一卡| 在线电影一区| 国产精品白丝av嫩草影院| 欧美在线一级视频| 亚洲日本视频| 国产农村妇女精品一区二区| 亚洲欧美日韩天堂| 黑人巨大精品欧美黑白配亚洲| 久久国产精品99国产| 亚洲激情国产精品| 国产精品青草综合久久久久99| 亚洲综合日韩中文字幕v在线| 国产精品高潮久久| 久久久视频精品| 精品成人一区| 久久综合电影| 亚洲视频导航| 在线观看日韩专区| 欧美国产精品人人做人人爱| 亚洲性感美女99在线| 好吊日精品视频| 欧美午夜影院| 欧美成人小视频| 国产日韩一级二级三级| 欧美激情精品久久久久| 欧美在线视频免费观看| 99视频热这里只有精品免费| 国产亚洲欧美另类中文 | 欧美精品七区| 久久久噜噜噜久久人人看| av不卡在线观看| 尤物视频一区二区| 国产精品日韩精品欧美在线| 欧美成人久久| 中国女人久久久| 在线看日韩欧美| 国产热re99久久6国产精品| 久久久91精品国产一区二区精品| 在线观看一区二区精品视频| 国产精品成av人在线视午夜片| 香蕉久久久久久久av网站 | 亚洲精选一区| 狠狠色丁香婷综合久久| 欧美性一区二区| 欧美在线地址| 亚洲性感激情| 亚洲黄色三级| 韩国精品在线观看| 国产精品日韩专区| 久久青草久久| 午夜精品福利视频| 伊人久久噜噜噜躁狠狠躁 | 欧美国产国产综合| 久久人人看视频| 欧美在线首页| 先锋影音国产精品| 亚洲视频中文字幕| 亚洲毛片播放| 91久久精品一区二区别| 狠狠色丁香婷婷综合影院| 国产精品丝袜白浆摸在线| 开心色5月久久精品| 中文在线资源观看网站视频免费不卡 | 亚洲欧美在线另类| 宅男噜噜噜66国产日韩在线观看| 国产日韩在线播放| 国产精品伦理| 国产精品多人| 男女视频一区二区| 久久亚洲国产精品一区二区| 一区二区三区黄色| 亚洲美女诱惑| 亚洲精品日韩久久| 亚洲精品美女在线观看播放| 亚洲国语精品自产拍在线观看| 国产乱肥老妇国产一区二| 欧美刺激性大交免费视频| 亚洲女同在线| 亚洲伊人网站| 亚洲欧美国产高清| 亚洲欧美日本国产专区一区| 亚洲欧美日韩国产一区二区三区|