🙌

SwiftDataで多対多の設定

2024/06/26に公開

環境

Xcode 15.4
iOS 17.5
シミュレータ
M1 Mac mini

状況 & やりたいこと

  • SwiftData
  • モデルは多対多、双方向
  • 自分を削除するときに相手は削除しない。相手の中にある「自分」を削除する
  • 自分の中にある相手を削除(つまり配列の1要素を削除)するときに相手は削除しない。相手の中にある「自分」を削除する

下の例で言うと
「自分を削除」はAインスタンス(or Bインスタンス)をまるごと削除
「自分の中にある相手を削除」はAの中のb配列(or Bの中のa配列)の要素を(ひとつ)削除

ソース

@Model
final class A {
    var name: String
    @Relationship(deleteRule: .nullify, inverse: \B.a) var b: [B] = []
    //以下略
@Model
final class B {
    var name: String
    @Relationship(deleteRule: .nullify) var a: [A] = []
    //以下略

注意

inverse がないと挙動が変わる
inverse は片方で良い

おまけ

N:N
many to many

Discussion