我有一本字典Structs
.我试图分配struct
我循环时的值dictionary
.斯威夫特告诉我cannot assign to 'isRunning' in 'blockStatus'
.我一直没能找到在文档上的任何这种特殊的不变性dictionaries
或structs
.
直接从操场上:
import Cocoa struct BlockStatus{ var isRunning = false var timeGapForNextRun = UInt32(0) var currentInterval = UInt32(0) } var statuses = ["block1":BlockStatus(),"block2":BlockStatus()] for (block, blockStatus) in statuses{ blockStatus.isRunning = true } cannot assign to 'isRunning' in 'blockStatus' blockStatus.isRunning = true
如果我将其更改struct
为a,这确实有效class
.
我猜它与复制结构并始终引用类的事实有关?
编辑:所以即使它是复制它..为什么我不能改变它?它会给我带来错误的结果,但你可以改变常量的成员而不是常量本身.例如,你可以这样做:
class A { var b = 5 } let a = A() a.b = 6
Sulthan.. 22
你的猜测是真的.
通过访问blockStatus
,您将创建它的副本,在这种情况下,它是一个常量副本(迭代器始终是常量).
这类似于以下内容:
var numbers = [1, 2, 3] for i in numbers { i = 10 //cannot assign here }
参考文献:
控制流
在上面的示例中,index是一个常量,其值在循环的每次迭代开始时自动设置.
类和结构
值类型是在将其分配给变量或常量时或者传递给函数时复制的类型.[...]所有结构和枚举都是Swift中的值类型
方法
结构和枚举是值类型.默认情况下,无法在其实例方法中修改值类型的属性.
但是,如果需要在特定方法中修改结构或枚举的属性,则可以选择改变该方法的行为.然后,该方法可以从方法中改变(即更改)其属性,并且当方法结束时,它所做的任何更改都将写回原始结构.该方法还可以为其隐式self属性分配一个全新的实例,并且该新实例将在方法结束时替换现有实例.
您可以通过将mutating关键字放在该方法的func关键字之前来选择此行为:
StrangeDays.. 6
您可以使用索引遍历数组
for index in 0..这应该工作,而不是"无法分配"
您可以使用索引遍历数组
for index in 0..<statuses.count { // Use your array - statuses[index] }
这应该工作,而不是"无法分配"
你的猜测是真的.
通过访问blockStatus
,您将创建它的副本,在这种情况下,它是一个常量副本(迭代器始终是常量).
这类似于以下内容:
var numbers = [1, 2, 3] for i in numbers { i = 10 //cannot assign here }
参考文献:
控制流
在上面的示例中,index是一个常量,其值在循环的每次迭代开始时自动设置.
类和结构
值类型是在将其分配给变量或常量时或者传递给函数时复制的类型.[...]所有结构和枚举都是Swift中的值类型
方法
结构和枚举是值类型.默认情况下,无法在其实例方法中修改值类型的属性.
但是,如果需要在特定方法中修改结构或枚举的属性,则可以选择改变该方法的行为.然后,该方法可以从方法中改变(即更改)其属性,并且当方法结束时,它所做的任何更改都将写回原始结构.该方法还可以为其隐式self属性分配一个全新的实例,并且该新实例将在方法结束时替换现有实例.
您可以通过将mutating关键字放在该方法的func关键字之前来选择此行为: