结论
stuct是值类型
- 当将一个结构体实例赋值给另一个变量或作为参数传递给函数时,会进行值拷贝,创建一个新的独立副本。
- 对副本的修改不会影响原始的结构体实例。
class是引用类型
- 当将一个类的实例赋值给另一个变量或作为参数传递给函数时,传递的是引用。
- 多个变量可以引用同一个类的实例,对其中一个引用所做的修改会影响到其他引用指向的同一个实例。
问题
var a赋值后修改子属性不生效
struct Component {
var selectValue = ""
}
var dict:[String: Component] = [:]
dict["a"] = Component()
dict["b"] = Component()
var a = dict["a"]!
print("修改前:" + (dict["a"]?.selectValue ?? "error"))
a.selectValue = "999"
print("修改后:" + (dict["a"]?.selectValue ?? "error"))
结果:
这里字典中数据未被修改,修改的只是a这个变量
解决
使用class定义
class Component {
var selectValue = ""
}
var dict:[String: Component] = [:]
dict["a"] = Component()
dict["b"] = Component()
var a = dict["a"]!
print("修改前:" + (dict["a"]?.selectValue ?? "error"))
a.selectValue = "999"
print("修改后:" + (dict["a"]?.selectValue ?? "error"))
结果:
字典数据被修改,逻辑无问题