标识(通过:\。self)-它有什么作用?

时间:2019-06-05 21:14:22

标签: swift swiftui keypaths

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

auto

它有什么作用? <a href="test.html" div="mydiv" class="myclass" layer="mylayer">Hi</a> <button type="button" name="button" value="btnValue" id="btn">Hi again</button> 指向哪里?当前对象(const items = document.querySelectorAll('a,button'); for (let item of items) { item.addEventListener('click', event => { event.preventDefault(); let attribute_object = {}; for (let attribute_key in event.target.attributes) { const key = parseInt(attribute_key); if (key >= 0) { const attribute = event.target.attributes[key]; attribute_object[attribute.name] = attribute.value; } } console.log(attribute_object); }) } )?由于... ForEach(ContentSizeCategory.common.identified(by: \.self)) ... 不是self的成员,因此它甚至无法在我的计算机中编译。我以为我以前在TraitCell_Preview谈话(common)中看过它。 ContentSizeCategory在Swift中并不是我最好的东西。

我了解SwiftUI的元素必须为\.selfKeypath(又名ForEach对吗?)仅符合Identifiable,而不符合self(如果TraitCell_Preview符合的私有PreviewProvider协议不符合Identifiable,对此不确定,因为我看不到代码)。

代码段中的_PreviewProvider是什么?它指向何处?

2 个答案:

答案 0 :(得分:3)

  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

答案 1 :(得分:1)

方法self是一个返回对象本身的属性,例如:

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

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

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