ios - 我正在使用 var 创建对象,因为我改变了它们,但我收到警告 : "Variable ' variableName' was never mutated, 考虑......”

标签 ios swift swift2

我在启动时使用 var 创建 Dictionaries,因为稍后当用户执行某些操作时我会修改它们。 字典 被添加到单例类 中的数组 中以在多个地方使用,但我收到警告“Variable 'variableName' 从未发生过突变,请考虑......” 在我创建它们的地方

如果我用 let 制作它们,当我用 var 从数组中获取对象形式数组来修改它时,没有崩溃,没有警告,什么都没有...

这是什么原因?

UPDATE:

我的单例类:

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 有警告“Variable 'variableName' was never mutated, consider...”

这不是一个错误槽,这是一个警告,我很好奇我是否可以让它们沉默或者我可以做些什么让它们消失

最佳答案

事实

  1. 您将 avion 声明为方法 createInitialShapeArray 的局部变量
  2. 您没有在定义范围内改变 avion
  3. avion 是一个字典,因此是一个结构(应用了值类型规则)

结论

avion不需要声明为变量,应该是常量。

请注意你写的地方

array_shapes = [avion, ...]

您正在创建 avion 的副本(因为它是字典)。

因此,如果您更改 array_shapes 中的值,您将更改另一个值

因此,归根结底,您没有发生变异 avion...编译器是正确的,它应该是一个常量。

例子

请考虑以下代码

func foo() {
    var dict = [1: "One"] // <-- Compiler warning
    var anotherDict = dict
    anotherDict[2] = "Two"
}

这里我得到了相同的编译器警告

Variable 'dict' was never mutated; consider changing to 'let' constant

发生这种情况是因为我正在更改 anotherDict 不仅仅是对同一值的另一个引用,它实际上是一个完全不同的值。这是 Struct(s)Enum(s) 的规则,因为它们是 Value Types

希望这对您有所帮助。

关于ios - 我正在使用 var 创建对象,因为我改变了它们,但我收到警告 : "Variable ' variableName' was never mutated, 考虑......”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32923877/

相关文章:

iOS 呈现 View Controller 动画为 'Push'(左右动画)

ios - 在Swift中仅改组结构的一部分

ios - Alamofire GET 请求无法正常工作

ios - 快速修改 tableViewController 之外的表

swift 无法显示 imageview 底部的 View

windows - 使用 Swift 编写 Windows 应用程序

objective-c - iOS 如何从数组中读取值

ios - 为我的 iOS 应用创建指南(教程)

ios - 如何检查用户输入的答案是否有字母,如果有,您如何将该答案默认为 0?

ios - 分配一个新的带有 nil 属性的 swift 类对象返回我 nil 对象