在for循环中写保护?

时间:2015-06-17 12:53:03

标签: swift let

一个奇怪的行为:我有几个对象和数组:

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

有效!

1 个答案:

答案 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对象。