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

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

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

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

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

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

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

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

閉包表達式

閉包表達式語法

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

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

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

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

創建閉包

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

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

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

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

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

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

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

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

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

閉包作為函數參數

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • Flowable工作流引擎的科普與實踐

    一.引言當我們在日常工作和業務中需要進行各種審批流程時,可能會面臨一系列技術和業務上的挑戰。手動處理這些審批流程可能會導致開發成本的增加以及業務復雜度的上升。在這
  • 小紅書1周漲粉49W+,我總結了小白可以用的N條漲粉筆記

    作者:黃河懂運營一條性教育視頻,被54萬人&ldquo;珍藏&rdquo;是什么體驗?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點贊!更瘋狂的是,這
  • 信通院:小米、華為等11家應用商店基本完成APP簽名及驗簽工作

    中國信通院表示,目前,小米、華為、OPPO、vivo、360手機助手、百度手機助手、應用寶、豌豆莢和努比亞等9家應用商店,以及抖音和快手2家新型應用分發平
  • iQOO 11S新品發布會

    iQOO將在7月4日19:00舉行新品發布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀。  美國時間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內容審核等。此前,T
Top 主站蜘蛛池模板: 广州市| 萝北县| 哈尔滨市| 两当县| 天镇县| 抚宁县| 仙居县| 汶川县| 长乐市| 长宁县| 兴隆县| 沁阳市| 平湖市| 会昌县| 东明县| 马关县| 铁力市| 遵义县| 罗山县| 咸宁市| 夏津县| 宁南县| 修文县| 龙口市| 绥宁县| 工布江达县| 樟树市| 怀远县| 华蓥市| 当涂县| 南溪县| 玛多县| 五台县| 九江市| 兴和县| 观塘区| 视频| 伊春市| 三台县| 临沂市| 新化县|