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印刷リファレンスタイプアドレス、値タイプアドレス