我正在使用var创建对象,因为我改变它们但是我收到警告:"变量' variableName'从未发生变异,考虑......"

时间:2015-10-03 14:49:59

标签: ios swift swift2

我正在使用 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;

这不是一个错误的低谷,它是一个警告,我很好奇,如果我可以让他们沉默或我能做些什么让他们消失

2 个答案:

答案 0 :(得分:4)

在Swift数组中,字典被声明为struct,所以当你将它们传递给其他函数或在赋值中使用它们时,它们的值被复制而不是作为引用传递,就像它为类所做的那样,这意味着当您将avion传递给数组的append()函数,并传递字典副本,以便原始变量永远不会发生变异。

当您尝试修改数组中的字典时会发生同样的事情,从而复制您感兴趣的字典dict:您不是在共享实例中修改数组而是修改局部变量{{1} }。

答案 1 :(得分:4)

事实

  1. 您将avion声明为方法createInitialShapeArray
  2. 的局部变量
  3. 您没有在定义它的范围内变异avion
  4. avionDictionary因此Struct(应用了值类型规则)
  5. 结论

    无需将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

    希望这有帮助。