identified(by: \.self) - 它是做什么的?

identified(by: \.self) - what does it do?

在此视频中:https://developer.apple.com/videos/play/wwdc2019/103/,以下代码片段显示在 15:30 附近:

...
ForEach(ContentSizeCategory.common.identified(by: \.self))
...

它有什么作用? self 指向哪里?当前对象(TraitCell_Preview)?它甚至无法在我的计算机中编译,因为 common 不是 ContentSizeCategory 中的成员。我以为我以前在 SwiftUI 演讲 (\.self) 中见过它。不过 Keypath 并不是我在 Swift 中最好的东西。

我明白 ForEach 的元素需要是 Identifiableself(a.k.a。TraitCell_Preview 对吗?)只符合 PreviewProvider 而不是 Identifiable(如果私有 _PreviewProvider 协议来自 PreviewProvider 符合不符合 Identifiable,不确定,因为我看不到代码)。

代码片段中的 \.self 是什么,它指向哪里?

方法self是一个属性即returns对象本身,例如:

let string = "text"
print(string[keyPath: \.self]) // "text"

我们在访问类型时也使用它,例如Int.self.

我假设整个实例都用作标识符。

  1. 看起来 common 是他们为帮助演示而创建的 static 变量。它只是 ContentSizeCategory 的扩展。像这样:
extension ContentSizeCategory {
     static var common = [ContentSizeCategory.accessibilityLarge,
                          ContentSizeCategory.accessibilityMedium,
                        ContentSizeCategory.extraSmall]

}
  1. ContentSizeCategory 是一个枚举,符合 Hashable ,这意味着每个类型都是唯一可识别的。下面是 identified 函数的签名,当它被调用时你需要告诉它应该使用什么关键路径来唯一标识项目。所以 \.self 基本上是在告诉整个自我是唯一的,因为它符合 Hashable。
func identified<ID>(by getID: KeyPath<Binding<Value.Element>, ID>) -> IdentifierValuePairs<Binding<Value>, ID> where ID : Hashable