You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:理解闭包逻辑 函数内调用闭包参数的运行原理是什么?

Swift闭包参数匹配运行逻辑

你给出的代码完整如下:

import UIKit
func study(reviseNotes: (String) -> Void) {
    print("1")
    let notes = "Napoleon was a short, dead dude."
    print("2")
    for _ in 1...10{
        reviseNotes(notes)
    }
}

study(reviseNotes:{(notes:String) in
    print("3")
    print("I'm reading my notes \(notes)")
})

核心逻辑说明

你这里的study是典型的高阶函数(接收其他函数/闭包作为参数的函数),参数reviseNotes的类型是(String) -> Void,含义是「接收1个String类型入参、无返回值的可执行代码块」,你调用study时传入的大括号内的闭包,会和reviseNotes形参绑定,内部调用reviseNotes(notes)就是直接执行你传入的闭包代码。

逐步运行流程

  • 程序初始化阶段只会加载study的函数定义,不会执行内部代码
  • 当执行到study(reviseNotes:{...})调用语句时:
    1. 先把大括号内的闭包代码打包为可执行的代码块,作为实参赋值给study的reviseNotes形参,相当于reviseNotes这个变量现在存的就是你写的闭包的执行入口
    2. 进入study内部执行逻辑:
      • 执行print("1"),控制台输出1
      • 生成局部字符串常量notes,值为"Napoleon was a short, dead dude."
      • 执行print("2"),控制台输出2
      • 进入1到10的循环,每轮循环执行reviseNotes(notes):
        • 把study内部的notes字符串作为参数,传入reviseNotes指向的闭包
        • 闭包接收到传入的字符串,赋值给闭包自己的入参notes
        • 依次执行闭包内的print("3")、print("I'm reading my notes \(notes)"),每轮循环各输出一次,循环10次就总共输出10次3和10次对应的笔记内容

本质原理

函数/闭包类型的参数本质是一个指针,存的是传入的可执行代码块的内存地址,调用reviseNotes(notes)和调用普通函数的逻辑完全一致,区别只是普通函数是提前定义、绑定了固定名称,而闭包是调用时临时传入的匿名代码块。


内容的提问来源于stack exchange,提问作者erkan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:54:03