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
变量并放入闭包。您明白吗?如果您不明白,请告诉我。阅读更多信息