类
假设我们在Swift中有一个类型,它是一个class
:
class MyClass {
var a:Int
init(i:Int) {
a = i
}
}
let aClass = MyClass(i: 10)
var bClass = aClass
bClass.a = 20
aClass.a // 20
aClass.a = 30
bClass.a // 30
这里展示了指针样式的行为:aClass和bClass指向同一个对象。如果你在其中一个对象中改变属性值,两个对象都会改变,因为它们是相同的。
结构体
当使用struct
时,行为会发生改变,如下所示:
struct MyStruct {
var a:Int
init(i:Int) {
a = i
}
}
let aStruct = MyStruct(i: 10)
var bStruct = aStruct
bStruct.a = 20
aStruct.a
使用struct和enum代替单个实例和多个指向该实例的指针,当我们将值分配给新实例时会创建一个新实例。它是原始实例的副本,并且它们彼此独立。
由于Swift数组类型是struct,因此它具有复制而不是指向的行为。而NSArray和NSMutableArray仍然是类(如ObjC中),因此具有类的指向行为。
可以使用inout属性和计算变量来部分复制指针的行为,以使struct表现得像class。
struct MyStruct {
lazy var map = [String:[String]]()
var list:[String] {
mutating get {
if map["list"] == nil {
map["list"] = [String]()
}
return map["list"]!
}
set {
map["list"] = newValue
}
}
}
var mS = MyStruct()
mS.list = ["test"]
mS.map
mS.list
在类型实例之外,您可以执行以下操作:
var map = [String:[String]]()
var list = [String]()
var appendToList = { (a:String) in
list.append(a)
map["list"] = list
}
appendToList("test") // list and map["list"] are both updated