SwiftUI | weakの意味と目的

SwiftUI

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の意味と目的を説明した。

コメント

タイトルとURLをコピーしました