美文网首页
Swift 中结构体和class混用

Swift 中结构体和class混用

作者: 不辣先生 | 来源:发表于2020-09-10 14:28 被阅读0次
    class D {
        var sex:String
        var age:Int
    
        init(sex:String,age:Int) {
            self.sex = sex
            self.age = age
        }
    }
    struct A {
        var name:String
        var num:Int
        
    
        var stu:D
        init(name:String,num:Int,stu:D) {
            self.name = name
            self.num = num
            self.stu = stu
            
        }
    }
    class B {
        var a:A
        var height:NSString
        init(p:A,h:NSString) {
            self.a = p
            self.height = h
        }
    }
    struct C {
        var c:Int
        var a:A
        var b:B
    }
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            let st = D(sex: "男", age: 23)
            var a = A(name: "我是A", num: 9, stu: st)
            
            let b = B(p: a, h: "180")
            let c = C(c: 3, a: a, b: b)
            a.name = "我变了"
            a.num = 1
            st.age = 0
            st.sex = "女"
            b.height = "120"
            print("b:\(b.a.name) \(b.a.num)\nc:\( c.a.name) \(c.a.num)\na:\(a.name) \(a.num)")
            print("\nst:\(st.age) \(st.sex)\na:\(a.stu.age) \(a.stu.sex)")
            print("b:\(b.height) \nc:\(c.b.height)")
        }
    
    

    打印结果如下:

    b:我是A 9
    c:我是A 9
    a:我变了 1
    st:0 女
    a:0 女
    b:120
    c:120

    结论:

    结构体对Class(class即引用类型)是增加指针指向,修改class,结构体也会改变,在定义model的时候可以合理使用这两种类型,能用结构体别用class,结构体值类型更高效安全
    这里有必要提一下Swift的写实复制技术,具体可以参考如下

    class Ball {
        var value = "fb"
    }
    struct FootBall {
        var size = 0
        private var ball = Ball()
        var value: String {
            get {
                return ball.value
            }
            set {
                guard isKnownUniquelyReferenced(&ball) else {
                    ball = Ball()
                    ball.value = newValue
                    return
                }
                ball.value = newValue
            }
        }
    }
    
    

    关键是这个isKnownUniquelyReferenced接口,作用判断对象是否只有一个持有者
    通过吧clas的属性提到struct中,隐式访问结构体的class属性,判断是否只有一个指针指向来决定写实是否copy,可以进一步把class定义为继承NSObjct的oc对象,在class里面实现nscopy协议,新建class属性对象直接copy即可

    这里再提供一个”简易版“(读写都拷贝),传值不拷贝,必须触发get方法才会执行拷贝,主要是写实copy那个对每个属性来一遍,如果class属性很多,代码量太多,但是性能肯定是前者优于后者

    class Aclass {
        var age: Int = 0
    }
    
    public struct Astruct {
        private var temp = Aclass()
        var num: Int = 0
        var aclass: Aclass {
            mutating get {
                if isKnownUniquelyReferenced(&temp){
                    return temp
                }else{
                    let new = Aclass()
                    new.age = temp.age
                    temp = new
                    return temp
                }
            }
            set {
                temp = newValue
            }
        }
    }
    

    注意:copy-on-write(这个是基于值类型的)技术在苹果系统提供的的数据类型(就算是值类型里有引用类型的属性或者元素)实现了,如果值类型里混合了自定义的引用类型需要手动实现这个,如上两种方式皆可
    补充:1.地址打印swift 打印引用类型地址,值类型地址

    相关文章

      网友评论

          本文标题:Swift 中结构体和class混用

          本文链接:https://www.haomeiwen.com/subject/ywkpektx.html