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

當(dāng)前位置:首頁 > 科技  > 軟件

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

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

2JU28資訊網(wǎng)——每日最新資訊28at.com

本文我們將介紹 Swift 中閉包表達式、尾隨閉包和逃逸閉包等相關(guān)的內(nèi)容。如果你尚未安裝 Xcode 和配置 Swift 開發(fā)環(huán)境,請您先閱讀這篇文章。2JU28資訊網(wǎng)——每日最新資訊28at.com

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

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

閉包表達式

閉包表達式語法

閉包表達式是一種輕量級語法,用于表示內(nèi)聯(lián)閉包。它的語法如下:2JU28資訊網(wǎng)——每日最新資訊28at.com

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

相關(guān)說明如下:2JU28資訊網(wǎng)——每日最新資訊28at.com

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

創(chuàng)建閉包

了解了閉包表達式的語法之后,我們來創(chuàng)建一個閉包。2JU28資訊網(wǎng)——每日最新資訊28at.com

Swift Code2JU28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

如果閉包體只包含一條語句,可以省略 return 關(guān)鍵字:2JU28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

下面,我們來看一下等價的 TypeScript 代碼。2JU28資訊網(wǎng)——每日最新資訊28at.com

TypeScript Code2JU28資訊網(wǎng)——每日最新資訊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"

閉包作為函數(shù)參數(shù)

閉包可以作為函數(shù)的參數(shù),使得函數(shù)更加靈活。2JU28資訊網(wǎng)——每日最新資訊28at.com

Swift Code2JU28資訊網(wǎng)——每日最新資訊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 Code2JU28資訊網(wǎng)——每日最新資訊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"

閉包作為排序函數(shù)的參數(shù)

Swift Code2JU28資訊網(wǎng)——每日最新資訊28at.com

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

TypeScript Code2JU28資訊網(wǎng)——每日最新資訊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 中,閉包可以捕獲并存儲它們定義時所在上下文中的常量和變量。即使定義這些常量和變量的原始上下文已經(jīng)不存在,閉包仍然可以引用和修改這些值。下面我們來舉一個閉包捕獲外部函數(shù)的局部變量的示例:2JU28資訊網(wǎng)——每日最新資訊28at.com

Swift Code2JU28資訊網(wǎng)——每日最新資訊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 函數(shù)內(nèi)的 runningTotal  amount 變量。即使 makeIncrementer 函數(shù)的執(zhí)行已經(jīng)完成,這些捕獲的變量仍然存在于閉包內(nèi)。2JU28資訊網(wǎng)——每日最新資訊28at.com

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

TypeScript Code2JU28資訊網(wǎng)——每日最新資訊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 中是一個非常有用的特性,尤其是當(dāng)閉包作為函數(shù)的最后一個參數(shù)時。尾隨閉包語法使得在函數(shù)調(diào)用時將閉包寫在函數(shù)括號之外,使得代碼更加清晰。2JU28資訊網(wǎng)——每日最新資訊28at.com

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

Swift Code2JU28資訊網(wǎng)——每日最新資訊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 函數(shù)接受兩個整數(shù)和一個閉包作為參數(shù)。使用尾隨閉包語法,我們可以將閉包寫在函數(shù)調(diào)用的括號之外,使得代碼更加簡潔。在 TypeScript 中,并沒有直接的尾隨閉包語法,但可以通過將函數(shù)的最后一個參數(shù)定義為函數(shù)類型來達到類似的效果。2JU28資訊網(wǎng)——每日最新資訊28at.com

TypeScript Code2JU28資訊網(wǎng)——每日最新資訊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)是一個重要的概念,特別是在處理異步操作和回調(diào)時。逃逸閉包與非逃逸閉包的主要區(qū)別在于它們的生命周期:逃逸閉包可以在函數(shù)返回之后被調(diào)用,而非逃逸閉包則必須在函數(shù)返回之前被調(diào)用。逃逸閉包是在函數(shù)執(zhí)行完畢后才被調(diào)用的閉包。在參數(shù)列表前加上 @escaping 關(guān)鍵字表示該閉包逃逸。2JU28資訊網(wǎng)——每日最新資訊28at.com

Swift Code2JU28資訊網(wǎng)——每日最新資訊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 是一個逃逸閉包,因為它在函數(shù)返回之后的某個時間點被調(diào)用。在 TypeScript 中,雖然并沒有專門的逃逸閉包的語法,但我們可以通過傳遞函數(shù)作為參數(shù),并在異步操作完成后調(diào)用該函數(shù)來模擬逃逸閉包的效果。2JU28資訊網(wǎng)——每日最新資訊28at.com

TypeScript Code2JU28資訊網(wǎng)——每日最新資訊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 的異步操作處理都是處理延時執(zhí)行、異步執(zhí)行的強大工具。它們都允許函數(shù)在完成某些操作后再執(zhí)行一些代碼,這在處理網(wǎng)絡(luò)請求、數(shù)據(jù)庫操作等異步任務(wù)時非常有用。2JU28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

標(biāo)簽:
  • 熱門焦點
  • 對標(biāo)蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據(jù)今天鴻蒙OS 4.0的現(xiàn)場演示顯示,華為的實況窗可以更高效的展現(xiàn)出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 5月iOS設(shè)備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動,不過iOS由于設(shè)備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設(shè)
  • 把LangChain跑起來的三個方法

    使用LangChain開發(fā)LLM應(yīng)用時,需要機器進行GLM部署,好多同學(xué)第一步就被勸退了,那么如何繞過這個步驟先學(xué)習(xí)LLM模型的應(yīng)用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 最“俊美”淘寶賣家,靠直播和短視頻圈粉,上架秒光,年銷3000萬

    來源 | 電商在線文|易琬玉編輯|斯問受訪店鋪:Ringdoll戒之人形圖源:微博@御座的黃山、&ldquo;Ringdoll戒之人形&rdquo;淘寶店鋪有關(guān)外貌的評價,黃山已經(jīng)聽累了。生于1985年的他,哪
  • 阿里大調(diào)整

    來源:產(chǎn)品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • OPPO、vivo、小米等國內(nèi)廠商Q2在印度智能手機市場份額依舊高達55%

    7月20日消息,據(jù)外媒報道,研究機構(gòu)的報告顯示,在全球智能手機出貨量同比仍在下滑的大背景下,印度這一有潛力的市場也未能幸免,出貨量同比也有下滑,多家廠
  • 超級標(biāo)準(zhǔn)版旗艦!iQOO 11S全球首發(fā)iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數(shù)亮相,而下半年即將推出的頂級旗艦已經(jīng)成為了數(shù)碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 2022爆款:ROG魔霸6 冰川散熱系統(tǒng)持續(xù)護航

    喜逢開學(xué)季,各大商家開始推出自己的新產(chǎn)品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現(xiàn)在的
Top 主站蜘蛛池模板: 香格里拉县| 阿合奇县| 明溪县| 屏边| 巴马| 乌鲁木齐市| 迁安市| 永胜县| 海淀区| 泊头市| 桃源县| 松阳县| 邛崃市| 桦甸市| 永寿县| 凉城县| 磐安县| 清远市| 泸州市| 石棉县| 三穗县| 云阳县| 平凉市| 隆德县| 荥经县| 洪江市| 淮北市| 杭锦后旗| 绥中县| 长春市| 措美县| 岑巩县| 界首市| 乐亭县| 昭平县| 正定县| 朝阳县| 滨州市| 永昌县| 锡林浩特市| 望都县|