Swift_mutating

群组
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()
    }

  转载请注明: waitwalker Swift_mutating

  目录