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:{...})调用语句时:- 先把大括号内的闭包代码打包为可执行的代码块,作为实参赋值给
study的reviseNotes形参,相当于reviseNotes这个变量现在存的就是你写的闭包的执行入口 - 进入
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
相关产品推荐
相关产品推荐

