一个奇怪的行为:我有几个对象和数组:
for image in images {
for nextID in image.parts {
if nextID.number != 0 {
if let n = primaryLookUp[nextID.number] {
image.parts[0].newID = 0
nextID.newID = 0 // cannot assign!!!
}
}
}
nextID只是通过.parts数组。是不是会成为“让”任务,所以我以后不能改变任何东西?
image.parts[0].newID = 0
有效!
答案 0 :(得分:0)
我相信这是你所看到的解释:
循环变量的值是不可变的,就像它已被赋值为let
一样。
在第一个循环中,images
是一个对象数组(由class
定义)。由于类对象是引用类型,因此可以更改对象的字段。在这种情况下,只能分配循环变量image
。
在第二个循环中,image.parts
是一个struct
的数组。由于struct
是值类型,因此整个nextID
及其字段在循环中将是不可变的。
如果您将var
添加到第二个循环,则可以分配到nextID.newID
:
for image in images {
for var nextID in image.parts {
if nextID.number != 0 {
if let n = primaryLookUp[nextID.number] {
image.parts[0].newID = 0
nextID.newID = 0 // this now works!!!
}
}
}
}
但,您正在更改nextID
的副本(因为结构副本是按值计算的),并且您没有更改原始{{1}中包含的nextID
对象。