Swift 为什么“的价值”;someVariable";变量不存在';不要在下面的代码中更改

Swift 为什么“的价值”;someVariable";变量不存在';不要在下面的代码中更改,swift,closures,Swift,Closures,我只是在操场上尝试一些代码,我遇到了这种情况。我无法理解为什么someVariable的值在下面的代码中没有更新。有人能解释一下这种行为是什么吗 var someVariable = "something" let closure = { [someVariable] in print("This is \(someVariable)") } someVariable = "otherVariable" closure() 顺便说一句,代码的输出是这是一些您的闭包在初始化时捕获了参考变

我只是在操场上尝试一些代码,我遇到了这种情况。我无法理解为什么
someVariable
的值在下面的代码中没有更新。有人能解释一下这种行为是什么吗

var someVariable = "something"
let closure = { [someVariable] in
    print("This is \(someVariable)")
}
someVariable = "otherVariable"
closure()

顺便说一句,代码的输出是
这是一些

您的
闭包
在初始化时捕获了参考变量
一些变量
。初始化后所有更改都不会影响。

您的
闭包
在初始化时捕获了引用变量
someVariable
。init之后所有更改都不会影响。

因为您在初始点传递它,而
字符串
通过它们的值传递,它们的引用。所以一旦编译器通过它,它就会被复制为当前值(逻辑上)

最后,将其更改为此,您就可以开始了:

var someVariable = "something"
let closure: (String)->() = { someVariable in
    print("This is \(someVariable)")
}
someVariable = "otherVariable"

closure(someVariable)

因为您在初始点传递它,并且
String
s通过它们的值传递,所以不是它们的引用。所以一旦编译器通过它,它就会被复制为当前值(逻辑上)

最后,将其更改为此,您就可以开始了:

var someVariable = "something"
let closure: (String)->() = { someVariable in
    print("This is \(someVariable)")
}
someVariable = "otherVariable"

closure(someVariable)

closure
在声明时捕获要在闭包中使用的对象。当闭包捕获Value
struct
)类型或Reference
class
)类型的对象时,它的行为将不同

例如,在您的情况下,
someVariable
(即,
String
)是一个
值类型,因此一旦闭包捕获它,它将保留此变量的实际值的副本。将新值指定给
someVariable
时,闭包内的副本不会更改

但是如果在
闭包中捕获
引用
类型对象
,则它将
保留对该
对象的
引用
,并且该对象上的任何更改也将反映在闭包中。参见下面的示例

class Bhai {
    public var kam: String = ""
}

let b = Bhai()
b.kam = "something"
let closure = { [b] in
    print("This is \(b.kam)")
}
b.kam = "otherVariable"
closure()
// prints This is otherVariable

closure
在声明时捕获要在闭包中使用的对象。当闭包捕获Value
struct
)类型或Reference
class
)类型的对象时,它的行为将不同

例如,在您的情况下,
someVariable
(即,
String
)是一个
值类型,因此一旦闭包捕获它,它将保留此变量的实际值的副本。将新值指定给
someVariable
时,闭包内的副本不会更改

但是如果在
闭包中捕获
引用
类型对象
,则它将
保留对该
对象的
引用
,并且该对象上的任何更改也将反映在闭包中。参见下面的示例

class Bhai {
    public var kam: String = ""
}

let b = Bhai()
b.kam = "something"
let closure = { [b] in
    print("This is \(b.kam)")
}
b.kam = "otherVariable"
closure()
// prints This is otherVariable

我不是在寻找代码来让它工作。我想理解为什么输出是“某物”>,因为您在初始点传递它,而
String
s通过它们的值传递。我在答案中添加了更多细节。我不是在寻找代码使其工作。我想理解为什么输出是“某物”>,因为您在初始点传递它,而
String
s通过它们的值传递。我在答案中添加了更多细节。但它是
var
,我们可以重新分配variable@Hisenberg当您使用闭包的捕获列表功能时,它将捕获您输入的当前变量。(你可以像复制变量的值一样理解它)。那么当你更新
someVariable
时,它不会影响你在闭包中捕获的变量。@Hisenberg
[someVariable]
是您的闭包捕获列表。它将复制您的
someVariable
变量并放入闭包。您明白吗?如果您不明白,请告诉我。请阅读更多内容,但它是一个
var
,我们可以重新分配variable@Hisenberg当您使用闭包的捕获列表功能时,它将捕获当前变量y输入。(你可以像复制变量的值一样理解它)。然后当你更新
someVariable
时,它不会影响你在闭包中捕获的变量。@Hisenberg
[someVariable]
是您的闭包捕获列表。它将复制您的
someVariable
变量并放入闭包。您明白吗?如果您不明白,请告诉我。阅读更多信息