编程iOS开发者

在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

由于对主题细节不了解而导致的实际错误示例。


故事

在一个大型项目中,在表驱动的UI中混淆了普通的KeyPath和WritableKeyPath——尝试通过KeyPath更改模型的属性,导致运行时异常。


故事

在生成通用表单时,使用KeyPath绑定值,但尝试将方法反射为keypaths,导致无法编译和代码复杂化。


故事

开发者忘记为类添加ReferenceWritableKeyPath,导致UI和数据模型之间的双向绑定受阻:值在UI中更新,但模型保持不变。