群组
Flutter,iOS,Android,Python等,闲聊工作&技术&问题;
个人主页:https://waitwalker.cn
telegram群链接:https://t.me/joinchat/Ej0o0A1ntlq5ZFIMzzO5Pw
在swift中:struct,enum,class都可以定义方法和属性.但是struct和enum是值类型,值类型存储在栈区.class是引用类型,引用类型存在在堆区.
值类型:
平时我们常用的数据类型Int,Double,String,Array,Set等都是用结构体实现的,即也是值类型.当我们赋值或者复制一个值类型时,Swift编译器会复制一个全新的实例,包括它的所有成员属性,每次复制都会产生一个单独的,没有数据共享的新实例.值类型的复制是深拷贝类型.
引用类型:
引用类型是隐式数据共享,复制一个引用类型时,Swift编译器将会复制实例的一个引用,但不包括实例的属性,当对一个引用类型进行多次复制时,每一份复制将共享一份数据,执行的是浅拷贝.
struct Student {
var name:String = ""
var age:Int = 18
init(name:String, age:Int) {
self.name = name
self.age = age
}
}
class Teacher {
var name:String = ""
var age:Int = 18
init(name:String, age:Int) {
self.name = name
self.age = age
}
}
func printAddress(values:AnyObject...){
for value in values {
print(Unmanaged.passUnretained(value).toOpaque())
}
print("-----------------------------------------")
}
let stuA = Student(name: "张三", age: 18)
let stuB = stuA
printAddress(values: stuA.name as AnyObject)
printAddress(values: stuB.name as AnyObject)
let tchA = Teacher(name: "李四", age: 28)
let tchB = tchA
printAddress(values: tchA)
printAddress(values: tchB)
// log:
stuA 和 stuB
0x000060000387b660
-----------------------------------------
0x000060000387c1a0
-----------------------------------------
tchA 和 tchB
0x000060000366bcf0
-----------------------------------------
0x000060000366bcf0
-----------------------------------------
可以看出stuA完全深拷贝了一份给stuB.
mutating关键字
结构体和枚举是值类型。默认情况下,值类型的属性不能在它的实例方法中被修改。如果要在某个function中修改属性的值就必须要在这个function前使用mutating关键词.
private(set) var elements:[T] = []
/// isEmpty
var isEmpty:Bool{
get {
return elements.count == 0 ? true : false
}
}
/// top
var top:T? {
get {
return elements.count > 0 ? elements.last : nil
}
}
// MARK: - 构造函数
init() {
}
mutating func push(element:T) -> Void {
elements.append(element)
}
mutating func pop() -> Void {
guard elements.count > 0 else {
return
}
elements.removeLast()
}