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

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

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

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

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

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

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

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

閉包表達式

閉包表達式語法

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

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

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

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

創建閉包

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

Swift CodemFP28資訊網——每日最新資訊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 可以根據上下文推斷參數類型和返回類型,因此通常可以省略它們:mFP28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

TypeScript CodemFP28資訊網——每日最新資訊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"

閉包作為函數參數

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

Swift CodemFP28資訊網——每日最新資訊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 CodemFP28資訊網——每日最新資訊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 CodemFP28資訊網——每日最新資訊28at.com

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

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

Swift CodemFP28資訊網——每日最新資訊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 函數的執行已經完成,這些捕獲的變量仍然存在于閉包內。mFP28資訊網——每日最新資訊28at.com

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

TypeScript CodemFP28資訊網——每日最新資訊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 中是一個非常有用的特性,尤其是當閉包作為函數的最后一個參數時。尾隨閉包語法使得在函數調用時將閉包寫在函數括號之外,使得代碼更加清晰。mFP28資訊網——每日最新資訊28at.com

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

Swift CodemFP28資訊網——每日最新資訊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 中,并沒有直接的尾隨閉包語法,但可以通過將函數的最后一個參數定義為函數類型來達到類似的效果。mFP28資訊網——每日最新資訊28at.com

TypeScript CodemFP28資訊網——每日最新資訊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 關鍵字表示該閉包逃逸。mFP28資訊網——每日最新資訊28at.com

Swift CodemFP28資訊網——每日最新資訊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 中,雖然并沒有專門的逃逸閉包的語法,但我們可以通過傳遞函數作為參數,并在異步操作完成后調用該函數來模擬逃逸閉包的效果。mFP28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • 太卷!Redmi MAX 100英寸電視便宜了:12999元買Redmi史上最大屏

    8月5日消息,從小米商城了解到,Redmi MAX 100英寸巨屏電視日前迎來官方優惠,到手價12999元,比發布價便宜了7000元,在大屏電視市場開卷。據了解,Redmi MAX 100
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • 如何使用JavaScript創建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經瀏覽過購物網站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區域,以便瀏覽。結合這個小小的重要功能可以大大改善您網站的用戶體驗
  • JVM優化:實戰OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就&ldquo;胡錫進炒股是否知道認真報道&rdquo;展開討論。有
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更是首發搭載了聯發科天璣9200+旗艦
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
Top 主站蜘蛛池模板: 石棉县| 容城县| 东阳市| 铅山县| 兰州市| 如东县| 定陶县| 阿拉善右旗| 黑龙江省| 闵行区| 扶沟县| 湟源县| 衡水市| 旅游| 南通市| 武夷山市| 绥德县| 桂东县| 绥棱县| 贺州市| 岚皋县| 广平县| 大冶市| 兰考县| 岑巩县| 马龙县| 保亭| 松江区| 峡江县| 潢川县| 来安县| 张北县| 志丹县| 松潘县| 衡东县| 太白县| 开化县| 祥云县| 临潭县| 阿合奇县| 沈丘县|