Swiftにおける構造体とclassの混用

3026 ワード

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)
c:\( c.a.name) \(c.a.num)
a:\(a.name) \(a.num)") print("
st:\(st.age) \(st.sex)
a:\(a.stu.age) \(a.stu.sex)") print("b:\(b.height)
c:\(c.b.height)") }

印刷結果は次のとおりです。


b:A 9 cですA 9 aです1 st:0女a:0女b:120 c:120

結論:


構造体対Class(class=参照タイプ)はポインタの向きを増やし、classを修正することで構造体も変化します.modelを定義する際にこの2つのタイプを合理的に使用することができます.構造体別に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インタフェースで、作用判断対象が1人の所有者しかいないかどうかstructに言及し、構造体のclass属性に暗黙的にアクセスし、ポインタが1つしかないかどうかを判断して写実がcopyかどうかを決定し、さらにclassをNSObjctを継承するocオブジェクトとして定義し、classの中でnscopyプロトコルを実現することができる.新しいclassプロパティオブジェクトは直接copyで、ここでもう一つの「簡易版」(読み書きもコピー)を提供します.値をコピーしないで、getメソッドをトリガーしなければコピーを実行できません.主に写実copyはそれが各プロパティに対して1回来ます.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(これは値タイプに基づく)技術はアップルシステムが提供するデータ型(値タイプに参照タイプの属性や要素がある場合でも)で実現され、値タイプにカスタム参照タイプが混在している場合は手動で実現する必要があります.アドレス印刷swift印刷リファレンスタイプアドレス、値タイプアドレス