我在启动时使用 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...”
这不是一个错误槽,这是一个警告,我很好奇我是否可以让它们沉默或者我可以做些什么让它们消失
最佳答案
事实
- 您将
avion
声明为方法createInitialShapeArray
的局部变量 - 您没有在定义范围内改变
avion
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/