Swift inout 底层探究

2022-07-05  本文已影响0人  一粒咸瓜子

inout 与属性

inout 的本质就是引用传递(地址传递)
存储型属性是传递属性地址,计算型属性和设置了属性观察器的存储型属性是传递副本的地址。

struct Shape {
    var width: Int
    var side: Int {
        willSet { print("willSetSide", newValue) }
        didSet { print("didSet") }
    }
    var girth: Int {
        set { width = newValue / side; print("setGirth", newValue) }
        get { print("getGirth"); return width * side }
    }
    func show() {
        print("width=\(width), side =\(side), girth=\(girth)")
    }
}
func test(_ num: inout Int) { print("test"); num = 20 }
var s = Shape(width: 10, side: 4)

inout 与存储型属性

inout 与带有观察器的存储型属性

test(&s.side)
// willSetSide 20
// didSet

inout 与计算型属性

test(&s.girth) 
/**
  先调用 get,将返回值地址记录到一个临时的局部比变量
  调用 test 将保存的局部存储空间地址传递,修改其中的值为 num
  调用 set,newValue 为 num,width = num / side
*/
// getGirth
// test
// setGirth 20
上一篇 下一篇

猜你喜欢

热点阅读