在Swift/SwiftUI中,"\.self"实际上是什么作用?

6

我不完全理解以下代码中\.self的作用:

struct ContentView: View {
    @State private var numbers = [Int]()
    @State private var currentNumber = 1

    var body: some View {
        VStack {
            List {
                ForEach(numbers, id: \.self) {
                    Text("\($0)")
                }
            }

            Button("Add Number") {
                self.numbers.append(self.currentNumber)
                self.currentNumber += 1
            }
        }
    }
}

我正在遵循这个网址:https://www.hackingwithswift.com/books/ios-swiftui/deleting-items-using-ondelete。我现在对这种语言只有很基本的了解,因此可能无法理解高级说明,所以希望提供非常简单的说明或具有详细描述的类比。我认为它是将每个列表项的id设置为数字数组中的每个项目?如果我错了,请纠正我 - 但是每个id是否都设置为数字数组中每个条目中的整数? 如果是这样,那么当键入“ \ .self”时,“\”实际上是做什么的,与“\”相结合,“.self”实际上是做什么的?

从同一网站:为什么.self适用于ForEach? - pawello2222
1
阅读有关 Keypath 的内容。应用 key path \.selfInt(1) 将给出 Int(1),即 \.self 意味着 self,字面意思为自己。 - Asperi
1
感谢@Asperi和@pawello2222,我去阅读了这篇文章这篇文章。从我的理解来看,“\”开始一个keypath,引用像数组或结构体这样的对象?只要\ .self符合哈希协议(显然数组是符合的),那么Swift将自动创建一个哈希值作为id来使用。当你使用ForEach(_, id: hashable)时,Swift会隐式地知道如何处理这个哈希值。 - Super Noob
问题:id字段如何知道“.self”应该引用ForEach中的当前项目,而不是包含调用ForEach的函数的类?(因为self通常指的是您所在的类。) - bhause
2个回答

5

1

id: .self 告诉 Swift 使用对象的哈希作为唯一 id(keypath)。这就解释了为什么使用“self”这个名称。id: .self 对于基本的 Swift 类型如 Integer 和 String 特别有用。一方面,开发者不能为它们添加唯一的 id。另一方面,它们都是可哈希的,因此我们可以使用 id: .self。id: .self 不仅对于 ForEach 很有用,对于 List 也很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接