理解SwiftUI中的列表标识符

理解SwiftUI中的列表标识符,swift,swiftui,swiftui-list,Swift,Swiftui,Swiftui List,: 列表使用可识别的数据。您可以通过以下两种方式之一使数据可识别:通过与数据一起传递到唯一标识每个元素的属性的密钥路径,或者通过使数据类型符合可识别协议 我很好奇,对于按设计显示在语义上“相等”的项的列表,其含义是什么,创建的重复行应该以相同的方式运行(即,在按id删除时删除这两个行)。例如: List(["a", "b", "b", "c", "c"], id: \.self) { str in

:

列表使用可识别的数据。您可以通过以下两种方式之一使数据可识别:通过与数据一起传递到唯一标识每个元素的属性的密钥路径,或者通过使数据类型符合可识别协议

我很好奇,对于按设计显示在语义上“相等”的项的列表,其含义是什么,创建的重复行应该以相同的方式运行(即,在按id删除时删除这两个行)。例如:

List(["a", "b", "b", "c", "c"], id: \.self) { str in
  Text(str)
}
我想我看到一些消息来源说每一行都必须唯一标识。这是真的还是可以识别的

上面的代码似乎没有崩溃,而且工作正常——它真的正常吗

上面的代码似乎没有崩溃,而且工作正常——是真的吗 好吧

是的当然,列表ForEach需要以某种方式识别其项目。这对我们意味着什么?这意味着我们应该提供独特的项目列表或ForEach!但你可能会说,等一下,我并没有使我的数组或项目唯一,相反,我甚至还制作了重复的项目,那么为什么它会起作用呢

我想说的是,你绝对让你所有的物品都独一无二,这样一来,它们中只有一件存在,而不是两件或。,你会说怎么做?答案是在
id:\.self
中,当你使用
id:\.self
术语时,你实际上是在说并符合SwiftUI的整数索引id系统,使用
id:\.self
SwiftUI时,你要明白你不会向SwiftUI展示一种方法来理解哪个项目是哪个项目,然后它开始自己工作,并为你的物品提供了一个秘密身份

因此,您甚至可以从代码中删除:
id:\.self
的一部分,如果您可以向SwiftUI展示一种使您的项目可识别的方法,SwiftUI在这种情况下的工作方式非常棒,当您删除
id:\.self
时,它会开始分析列表/ForEach中的项目类型,然后自动搜索该类型中的可识别协议,这意味着您的CustomType也应该符合可识别协议

import SwiftUI

struct ContentView: View {
    
    @State private var array: Array<String> = ["a", "a", "a", "b", "b", "b", "c", "c", "c"]
    
    var body: some View {

        List(array) { item in
          Text(item)
        }
        
        Button("remove last item") {
            
            if array.count > 0 { array.remove(at: array.count - 1) }
            
        }
        .foregroundColor(Color.red)
        .font(Font.body.weight(Font.Weight.bold))
        
        
    }
}

extension String: Identifiable {
    
    public var id: UUID {
        get {
            return UUID()
        }
    }
    
}
让我举一个例子,我们将删除
id:\.self
,甚至创建更多重复项并删除项目,所有这些都是可以识别的

import SwiftUI

struct ContentView: View {
    
    @State private var array: Array<String> = ["a", "a", "a", "b", "b", "b", "c", "c", "c"]
    
    var body: some View {

        List(array) { item in
          Text(item)
        }
        
        Button("remove last item") {
            
            if array.count > 0 { array.remove(at: array.count - 1) }
            
        }
        .foregroundColor(Color.red)
        .font(Font.body.weight(Font.Weight.bold))
        
        
    }
}

extension String: Identifiable {
    
    public var id: UUID {
        get {
            return UUID()
        }
    }
    
}
导入快捷界面
结构ContentView:View{
@国家私有变量数组:数组=[“a”、“a”、“a”、“b”、“b”、“c”、“c”、“c”]
var body:一些观点{
列表(数组){中的项
文本(项目)
}
按钮(“删除最后一项”){
如果array.count>0{array.remove(at:array.count-1)}
}
.foregroundColor(颜色:红色)
.font(font.body.weight(font.weight.bold))
}
}
扩展字符串:可识别{
公共变量id:UUID{
得到{
返回UUID()
}
}
}

为什么要在列表中有重复的单元格?\。赛尔夫说数组中的每个元素都是唯一的,但如果有重复项,swift将在执行删除时删除第一个重复值。因此,如果删除最后一个“C”,swift将删除最后一个“C”。为了看得更清楚,最后放一个“b”,然后尝试删除。它可以很好地工作,但不会给您预期的结果。我希望有重复的单元格来构建一个假设的情况,以便更好地理解SwiftUI中的id约束,因为文档并没有让我感觉我真的理解它。您可以想一个数据库示例,比如在一个db表“User”中,您有3行,2个用户具有相同的名称。现在,如果你想删除一个用户,显然你不会根据名字来删除,而是根据某个唯一标识符(id)来删除一个PK,它唯一地确定了每条记录。我的回答对你有帮助吗?