我们如何强制 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 为静态?

陷入(php)foreach mysqli

如何强制 Netbeans 仅使用 -ggdb 编译标志而不使用它也自动发出 Makefile-Debug.mk 中的 -g 标志

如何强制秘银重绘而不进行差异化? (在秘银中整合德拉古拉)

如何强制 django 立即保存而不是在循环后进行批量更新