我正在使用 Dictionaries
在发布时创建var
,因为稍后当用户执行操作时我会修改它们。 Dictionaries
已添加到{strong>单一类的Array
内,可在多个地方使用,但我收到警告 "变量&#39 ; VARIABLENAME'从来没有变异,考虑...."
在我创建它们的地方
如果我用let
制作它们,当我从对象形式数组中修改它时,如果我从带有var
的数组中取出它,则不会发生崩溃,没有警告,也没有任何内容......
对此有何解释?
更新:
My Singleton Class:
class Config {
static let sharedInstance = Config()
var array_shapes: Array<Dictionary<NSObject,AnyObject>> = Array()
func createInitialShapeArray(){
var avion = createShapeDictionaryFor("Avion", objectName: "Avion", badgeStatus: "0", shapeImageName: "shape_avion");
//.......more objects like avion
array_shapes = [avion,//.....the other objects];
}
func createShapeDictionaryFor(objectID:String, objectName:String, badgeStatus:String, shapeImageName:String) -> Dictionary<NSObject,AnyObject>{
var dict: Dictionary<NSObject,AnyObject> = [:]
dict["objectID"] = objectID
dict["objectName"] = objectName
dict["badgeStatus"] = badgeStatus
dict["shapeImageName"] = shapeImageName
return dict;
}
}
当我在改变词典时(在主要课堂上):
@IBAction func btnPressed_done(sender:UIButton){
pennyPincherGestureRecognizer.recognize();
screenShotMethod()
var dict = Config.sharedInstance.array_shapes[Config.sharedInstance.currentShapeIndex] as Dictionary<NSObject,AnyObject>
dict["badgeStatus"] = "1"
self.initNextShape()
}
var avion
有警告&#34;变量&#39;变量名&#39;从来没有变异,考虑....&#34;
这不是一个错误的低谷,它是一个警告,我很好奇,如果我可以让他们沉默或我能做些什么让他们消失
答案 0 :(得分:4)
在Swift数组中,字典被声明为struct
,所以当你将它们传递给其他函数或在赋值中使用它们时,它们的值被复制而不是作为引用传递,就像它为类所做的那样,这意味着当您将avion
传递给数组的append()
函数,并传递字典副本,以便原始变量永远不会发生变异。
当您尝试修改数组中的字典时会发生同样的事情,从而复制您感兴趣的字典dict
:您不是在共享实例中修改数组而是修改局部变量{{1} }。
答案 1 :(得分:4)
avion
声明为方法createInitialShapeArray
avion
avion
是Dictionary
因此Struct
(应用了值类型规则)无需将avion
声明为变量,它应该是常量。
请注意你写的地方
array_shapes = [avion, ...]
您正在创建avion
的副本(因为它是字典)。
因此,如果您更改array_shapes
内的值,则表示您正在更改其他值。
因此,在一天结束时,你没有变异 avion
...并且编译器是正确的,它应该是一个常量。
请考虑以下代码
func foo() {
var dict = [1: "One"] // <-- Compiler warning
var anotherDict = dict
anotherDict[2] = "Two"
}
这里我收到相同的编译器警告
变量'dict'从未发生变异;考虑改为'让'常数
这是因为我正在更改anotherDict
不仅仅是对同一值的另一个引用,实际上是一个完全不同的值。这是Struct(s)
和Enum(s)
的规则,因为它们是Value Types
。
希望这有帮助。