在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.parts
是 struct
s 的数组。由于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循环中写保护?的主要内容,如果未能解决你的问题,请参考以下文章