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