swift - 识别(通过:\.self) - 它有什么作用?
问题描述
在此视频中: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
的元素需要Identifiable
。self
(又名TraitCell_Preview
对吗?)只符合PreviewProvider
所以不符合Identifiable
(如果符合的私有_PreviewProvider
协议PreviewProvider
不符合Identifiable
,则不确定,因为我看不到代码)。
代码片段中有什么\.self
,它指向哪里?
解决方案
- Looks like
common
是static
他们为帮助演示而创建的变量。它只是ContentSizeCategory
. 像这样的东西:
extension ContentSizeCategory {
static var common = [ContentSizeCategory.accessibilityLarge,
ContentSizeCategory.accessibilityMedium,
ContentSizeCategory.extraSmall]
}
ContentSizeCategory
是一个枚举,符合 Hashable,这意味着每种类型都是唯一可识别的。下面是identified
函数的签名,当它被调用时,你需要告诉它应该使用什么键路径来唯一标识项目。所以\.self
基本上告诉整个自我是独一无二的,因为它符合 Hashable。
func identified<ID>(by getID: KeyPath<Binding<Value.Element>, ID>) -> IdentifierValuePairs<Binding<Value>, ID> where ID : Hashable
推荐阅读
- c# - 带有 Resharper 建议的 C# 静态类
- c - 从使用非标准路径加载的 DLL 加载符号,该路径转发到另一个 DLL
- jquery - 为什么需要访问孩子以获取 $("body") 中的最后一个元素
- java - 如何将邮件中的 base64 图像附加到 JavaMail 和 MimeMessageHelper?
- python - 找不到页面 (404) 请求方法:GET 请求 URL:http://127.0.0.1:4000/person/persondetails/3
- docker - 同步包数据库
- c++ - 使用线程并行化 ssh 调用的 malloc 问题
- angular - 如何在 Angular 6 (rxjs 6) 中进行异步自动完成,它不会通过快速输入显示任何不相关的数据
- node.js - 在 node.js 中开发的 Alexa 技能不显示任何卡片
- java - 与 Jackson 接口的 Serialize 和 Deserialzie back list