我有这段代码,我想知道变量x的值在定义时是否被函数捕获,或者函数是否捕获到对变量本身的引用(或者还有其他东西)?

如果xval,那么一切的处理方式会不会有所不同?

// Kotlin
var x = 1
fun f(y: Int) = x + y // Function adds 1 to a given Int

x = 2
val y = 3
val z = f(x + y) // Calls f with argument of 5
// z now maps to 7
// Swift
var x = 1
func f(_ y: Int) -> Int {return x + y} // Function adds 1 to a given Int

x = 2
let y = 3
let z = f(x + y) // Calls f with argument of 5
// z now maps to 7

所以无论何时调用函数f,我们都要在函数定义的环境中计算它的主体{ x + y }.当我们定义这个函数时,我们有一个环境,x == 1.

因此函数f总是在其参数上加1,无论它在哪里调用.这是规矩.(这是let/val,不是var)

我的问题是关于var的函数闭包.

只要给我一个详细的解释(按照作用域链在内存中定位变量),谢谢.

推荐答案

在Kotlin和Swift中,使用var意味着闭包捕获变量本身的reference,而val/let是不可变的,捕获闭包创建时变量的value.

按照你给出的例子,如果你使用val,你会得到以下结果:

val x = 1 
val g = { x + 3 }  // Closure g captures the value 1
x = 2 // this would cause compilation error 

val z = g()    // z will be 4 (1 + 3)

Swift相关问答推荐

如何更新Square Order?

如何在AudioKit中实现自定义音效 node ?

如何观察UIViewRepresentable中的多个变化?

Swift ui 转换无法按预期工作

使用序列初始化字符串的时间复杂度是多少?

macOS SwiftUI: 如何触发删除一个项目?

CardStack 和 Lottie

ConfirmationDialog取消swiftui中的错误

我如何读取并通知可可 macos 中某个类的计算(computed)属性?

Swift UI 不重绘 NSViewRepresentable 包装的文本字段

ZStack 中的 ProgressView 与 View 的行为不同

如何在 Swift 中返回 Task 中定义的变量

在运行时访问 UIView 宽度

swift 3 错误:参数标签 '(_:)' 不匹配任何可用的重载

Alamofire:如何全局处理错误

如何从 UITableViewCell 类中引用 UITableViewController?

如何在 SwiftUI 中创建带有图像的按钮?

Swift 2.0 中的 do { } catch 不处理从这里抛出的错误

UILabel 文本不换行

UISearchbar TextField 的高度可以修改吗?