ProgrammingiOS開発者

Swiftにおけるkey-pathsとは何ですか?WritableKeyPathはどのように使用され、なぜ必要なのか、どのような課題を解決するのか、KeyPath APIを使用する際の罠は何か?

Hintsage AIアシスタントで面接を突破

回答。

Key-path(キー・パス)とは、オブジェクトのプロパティに「参照」から安全にアクセスするメカニズムです。これにより、プロパティへの完全な型安全なアクセスが可能になります。

struct Person { var name: String var age: Int } let kp = \Person.name let john = Person(name: "John", age: 30) print(john[keyPath: kp]) // "John"

WritableKeyPathは、プロパティを読み取るだけでなく、変更することも可能です:

var person = Person(name: "Foo", age: 22) let namePath: WritableKeyPath<Person, String> = \Person.name person[keyPath: namePath] = "Bar"

使用法:

  • モデルに対する一般的な操作(例えば、ソート、フィルタリング、UIとのデータバインディング)に使用されます。
  • 型安全性を失わずにユーザーに優しいリフレクションを構築するのに便利です。

注意点:

  • KeyPathは、コンパイラがアクセスできるプロパティのみです。
  • KeyPathはメソッドを保持できず、プロパティのみです。
  • WritableKeyPathの場合、オブジェクト(構造体)はvarである必要があります。

トリッキーな質問。

質問: 「通常のKeyPathを通じてクラスのプロパティを変更できますか(それともWritableKeyPathが必要ですか)?KeyPathとReferenceWritableKeyPathはどのように異なりますか?」

回答: 値をkey pathを通じて変更するには、WritableKeyPathが必要です。クラスの場合、ReferenceWritableKeyPathも存在し、参照型のためのkey-pathを通じたプロパティの変更が可能です。

class User { var score = 0 } let user = User() let path: ReferenceWritableKeyPath<User, Int> = \User.score user[keyPath: path] = 42 // OK

このテーマの細部を知らないことによる実際のエラーの例。


ストーリー

大規模なプロジェクトで、table-driven UIで通常のKeyPathとWritableKeyPathを混同し、KeyPathを介してモデルのプロパティを変更しようとした結果、runtime例外が発生しました。


ストーリー

ジェネリックなフォームを生成する際に値をバインディングするためにKeyPathが使用されたが、メソッドをkeypathsとしてリフレクションしようとした結果、コンパイル不可能となり、コードが冗長になりました。


ストーリー

開発者はクラスへのReferenceWritableKeyPathを追加するのを忘れ、UIとデータモデル間の双方向バインディングが阻害されました:UIで値が更新されたが、モデルは変更されませんでした。