在for循环中写保护?

Posted

技术标签:

【中文标题】在for循环中写保护?【英文标题】:write protection in for loop? 【发布时间】:2015-09-02 17:24:29 【问题描述】:

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

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

有效!

【问题讨论】:

【参考方案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 更改原件。如果您正在循环的数组包含对象,那么您可以更改原始数组。如果是结构数组,则必须使用索引。

以上是关于在for循环中写保护?的主要内容,如果未能解决你的问题,请参考以下文章

如何delphi中写一个程序使用次数限制,到期后需要注册码?

SQL 中循环for循环游标

SQL中的循环for循环游标

(转)SQL中的循环for循环游标

怎么用jQuery实现轮流间隔几秒循环显示?!

为啥在使用 joblib.Parallel 时保护主循环很重要?