KeyPathは静的に書くだけじゃない!KeyPathを動的に生成して再帰的な型のプロパティに効率良くアクセスしよう! by ockey

iOSDC Japan 2025
ルーキーズLT(5分)

KeyPathは静的に書くだけじゃない!KeyPathを動的に生成して再帰的な型のプロパティに効率良くアクセスしよう!

_ockey_ ockey _ockey_
2

皆さん、KeyPathを使っていますか?
普段の開発では静的なKeyPathを使う場面ばかりなのではないでしょうか。
例えば、SwiftUIのList(_:id:rowContent:)でKeyPathを静的に指定する場面です。

実は、KeyPathを動的に生成することで再帰的な型のプロパティに効率良くアクセスできるようになります。
再帰的な型とは、以下に示すようなものです。

struct Box: Identifiable {
let id: UUID
var children: [Box]
// その他のプロパティ
}

上記のBox型インスタンスでは、アクセスしたい子要素のidがわかっても簡単にはアクセスできません。childrenを先頭から調べて、idが一致するものがなければchildren[0].childrenのように1階層下をさらに先頭から調べて...と探索していては効率が悪いです。

辞書を使って[UUID: Box] のように値を持てば探索は速くなるものの、Valueに入るインスタンスが階層構造を持つため、同じ子要素が複数のValueに存在してSingle Source of Truthに反してしまいます。Boxのプロパティを更新する際に整合性を保つのは難しくなるでしょう。
そこで、階層が最も浅いルートからのKeyPathをValueにすることで、整合性を保ったまま効率良くアクセスできるようになります。

本LTでは以下をお話しします。

  • KeyPathを動的に生成する方法
  • KeyPathを使って再帰的な型のプロパティに効率よくアクセスする方法
  • ルートがオプショナルな場合のKeyPathの書き方
  • プロパティがswift-identified-collectionsのIdentifiedArrayな場合のKeyPathの書き方