Swift:闭包如何捕获值类型的变量?

标签 swift struct closures value-type

看看下面的代码片段

struct Person{
  var name: String
  let surname: String
  var closure: (()->())?
   init(name: String, surname: String){
      self.name = name
      self.surname = surname
    
   }
}

var person = Person(name: "John",  surname: "Lennon")
let cl = {
   print(person.name)
}

person.name = "Bill"
cl()
print(person.name)

上面代码片段的输出是

Bill
Bill

有人能解释一下这是怎么发生的吗?我认为,由于闭包是引用类型而 Person 是值类型,因此当创建闭包时,它会获得自己的 Person 副本(因为值类型是在传递时复制的), 所以修改外部 Person 应该不会影响被闭包捕获的 Person ,但它似乎不能以这种方式工作。我是 swift 和值类型的新手,所以请不要过于苛刻地判断我的问题。
谢谢
我知道我们可以使用捕获列表显式捕获值变量,在这种情况下修改外部变量不会影响捕获的变量。问题不在于此。问题是我认为即使没有显式捕获也应该采用相同的方式

最佳答案

只有当您显式地将变量传递给闭包时,您期望的行为才会起作用,如下所示:

var person = Person(name: "John",  surname: "Lennon")
let cl: (Person) -> () = { person in
    print(person.name)
}
cl(person)
person.name = "Bill"
cl(person)

当您在闭包中隐式捕获一个变量时,该变量总是通过引用传递。如果要按值捕获变量,则需要显式传入。

关于Swift:闭包如何捕获值类型的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65322747/

相关文章:

ios - SwiftUI 选择器中选定选项的值不会更新 View

swift - 如何在 Swift 中将关联类型(通用协议(protocol))的协议(protocol)作为参数传递?

objective-c - 设置和使用 obj-c CGPoint、CGRect 和其他

c - 为什么要用 union 包装结构?

c - header 中定义的 TypeDef 结构

python - 嵌套函数如何在 Python 中工作?

ios - UIImagePNGRepresentation 失去透明度

ios - 将模型类传递给嵌套方法时出现 Swift 泛型方法问题

javascript - 事件处理程序的闭包 - 必须是 "return"

javascript - 闭包——常识?