【问题标题】:write protection in for loop?在for循环中写保护?
【发布时间】:2026-01-23 08:00:02
【问题描述】:

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

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 数组。 ist 是否成为“让”任务,因此我以后无法更改任何内容?

image.parts[0].newID = 0

有效!

【问题讨论】:

    标签: swift let


    【解决方案1】:

    我相信这就是你所看到的解释:

    循环变量的值是不可变的,就像它被分配了let一样。

    在您的第一个循环中,images 是一个对象数组(由 class 定义)。由于类对象是引用类型,因此您可以更改对象的字段。这种情况下只有循环变量image不能赋值。

    在您的第二个循环中,image.partsstructs 的数组。由于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 的副本(因为结构副本是按值计算的)并且您不会更改原始 image 对象中包含的 nextID。 p>

    【讨论】:

    • 感谢您的提示。我想改变原来的。所以我需要使用索引来代替 image.parts[ i ].newID = 0?没有简单的解决方案?
    • 您可以使用 image.parts[i].newID 更改原件。如果您正在循环的数组包含对象,那么您可以更改原始数组。如果是结构数组,则必须使用索引。