SwiftUIのweakの意味と目的を説明する。
結論
weakを付けて定義した変数は弱参照する変数になり、そのことで循環参照を防止できる。
具体例
weakを付けないことで循環参照に陥る例と、weakを付けて循環参照に陥らない例を示す。
weakを付けない
この例ではにわとりとたまごが循環参照になってしまう。
import SwiftUI
struct ContentView: View {
@State var 鶏: ?? = ?()
@State var 卵: ?? = ?()
var body: some View {
Button("ボタン") {
鶏?.たまご = 卵
卵?.にわとり = 鶏
}
.buttonStyle(.borderedProminent)
}
}
class ? {
var たまご: ??
}
class ? {
var にわとり: ??
}
Xcodeのデバッグエリアを見ると参照先が循環していることがわかる。
v self test.ContentView
v _鶏 SwiftUI.State<test.??>
v _value test.?? 0x0000600003400320
v たまご test.?? 0x0000600003400360
v にわとり test.?? 0x0000600003400320
v たまご test.?? 0x0000600003400360
v にわとり test.?? 0x0000600003400320
v たまご test.?? 0x0000600003400360
v にわとり test.?? 0x0000600003400320
v たまご test.?? 0x0000600003400360
・・・以下永遠に続く
v _location SwiftUI.AnyLocation<test.??>?
v _卵 SwiftUI.State<test.??>
v _value test.?? 0x0000600003400360
v にわとり test.?? 0x0000600003400320
v たまご test.?? 0x0000600003400360
v にわとり test.?? 0x0000600003400320
v たまご test.?? 0x0000600003400360
v にわとり test.?? 0x0000600003400320
v たまご test.?? 0x0000600003400360
・・・以下永遠に続く
_location SwiftUI.AnyLocation<test.??>?
weakを付ける
weakを付けるとにわとりとたまごが循環参照にならない。
import SwiftUI
struct ContentView: View {
@State var 鶏: ?? = ?()
@State var 卵: ?? = ?()
var body: some View {
Button("ボタン") {
鶏?.たまご = 卵
卵?.にわとり = 鶏
}
.buttonStyle(.borderedProminent)
}
}
class ? {
var たまご: ??
}
class ? {
weak var にわとり: ?? // ? weakを付ける
}
デバッグエリアを見ると参照先が循環していないことがわかる。
v self test.ContentView
v _鶏 SwiftUI.State<test.??>
v _value test.?? 0x00006000023dd700
v たまご test.?? 0x00006000023dd740
v にわとり test.?? 0x00006000023d9d61
v たまご test.?? 0x0000000800000003
v にわとり test.??
v some test.?
v たまご test.??
v _location SwiftUI.AnyLocation<test.??>?
v _卵 SwiftUI.State<test.??>
v _value test.?? 0x00006000023dd740
v にわとり test.?? 0x00006000023d9d61
v たまご test.?? 0x0000000800000003
v にわとり test.??
v some test.?
v たまご test.??
v _location SwiftUI.AnyLocation<test.??>?
まとめ
SwiftUIのweakの意味と目的を説明した。
コメント