【发布时间】:2023-03-12 03:32:01
【问题描述】:
看看下面的代码sn-p
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)
上面sn-p的输出是
Bill
Bill
有人能解释一下这是怎么发生的吗?我认为由于闭包是引用类型,Person 是值类型,所以当创建闭包时,它会获得自己的 Person 副本(因为值类型是在传递时复制的),所以修改外部 Person 不应该影响由闭包捕获的Person,但它似乎不能以这种方式工作。我是 swift 和 value 类型的新手,所以请不要太用力地判断我的问题。
谢谢
我知道我们可以使用捕获列表显式捕获值变量,在这种情况下修改外部变量不会影响捕获的变量。这个问题是没有的。问题在于我认为即使没有明确捕获它也应该具有相同的方式
【问题讨论】:
-
@JoakimDanielson 这是因为函数和闭包是引用类型。。取自官方 swift 文档docs.swift.org/swift-book/LanguageGuide/Closures.html。
-
隐式捕获不会创建卷影副本。您必须显式捕获才能获得该行为。
标签: swift struct closures value-type