我们如何强制 ForEach 使用 UUID 而不是 (id: \.self)?
Posted
技术标签:
【中文标题】我们如何强制 ForEach 使用 UUID 而不是 (id: \\.self)?【英文标题】:How we can force ForEach use UUID instead of (id: \.self)?我们如何强制 ForEach 使用 UUID 而不是 (id: \.self)? 【发布时间】:2020-11-02 03:09:24 【问题描述】:我有在 ForEach 循环中生成一些文本的代码,这个循环使用 (id: .self) 是 Int,但在这种情况下,我们生成的 (id = UUID()) 将被忽略! ForEach 可以处理一些内部 Int 数字!我们如何强制 ForEach 将我们构建的 UUID 作为 id?
struct Data: Identifiable
let id = UUID()
var name: String
let Data1 = Data(name: "Data 1")
let Data2 = Data(name: "Data 2")
let Data3 = Data(name: "Data 3")
let Data4 = Data(name: "Data 4")
class DataModel: ObservableObject
@Published var items: [Data] = [Data1, Data2, Data3, Data4]
struct ContentView: View
@StateObject var dataModel = DataModel()
var body: some View
ForEach(dataModel.items.indices, id: \.self) index in // ← Here: I want UUID
Text(dataModel.items[index].name)
.font(.title2)
.padding()
【问题讨论】:
您可以这样做:ForEach(dataModel.items) item in ...
,因为每个项目都符合 Identifiable
。另外,不相关,但我建议不要将其命名为 Data
,因为 Foundation 中已经定义了这种类型
关于命名你是对的,这些代码只是简单的示例!但是关于“ForEach(dataModel.items) item in ...”我知道,但我不能使用这种方式,因为我需要在我的真实代码中读取索引
【参考方案1】:
您可以使用zip
中提到的How do you use .enumerated() with ForEach in SwiftUI?
ForEach(Array(zip(dataModel.items.indices, dataModel.items)), id: \.1) index, item in
// index and item are both safe to use here
【讨论】:
谢谢,我看了一下链接,对我来说有点高级,我不明白为什么 \.1 ?zip
返回一个元组对序列。您可以使用 .1
访问元组对中的第二个元素,在本例中是项目 (Data
)。您可以查找有关 Swift 元组的信息以了解有关语法的更多信息。【参考方案2】:
你可以试试这个:
ForEach(dataModel.items.map $0.id , id: \.self) uuid in // ← Here: I want UUID
【讨论】:
它不起作用,而且您已经将索引更改为 uuid!我的代码中需要索引! 我明白了,所以当你说 // ← 这里:我想要 UUID 你实际上是指 // ← 这里:我想要索引。非常混乱。以上是关于我们如何强制 ForEach 使用 UUID 而不是 (id: \.self)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中生成 UUID,而不使用 boost 库?
使用自动布局,如何在 NSSplitView 中将子视图居中而不强制宽度 NSSplitView 为静态?
如何强制 Netbeans 仅使用 -ggdb 编译标志而不使用它也自动发出 Makefile-Debug.mk 中的 -g 标志