Swift DocumentId包装器工作不正常

Swift DocumentId包装器工作不正常,swift,google-cloud-firestore,firebase-authentication,swiftui,Swift,Google Cloud Firestore,Firebase Authentication,Swiftui,我在我的数据结构中使用@DocumentId: struct UserProfile : Codable, Identifiable { @DocumentID var id: String? = UUID().uuidString } 当我尝试访问id时,我会得到一个随机的字母字符串(04F9C67E-C4A5-4870-9C22-F52C7F543AA5),而不是firestore中文档的名称(GeG23o4GNJt5CrKEf3RS) 要访问documentId,我在Observ

我在我的数据结构中使用@DocumentId:

struct UserProfile : Codable, Identifiable {
    @DocumentID var id: String? = UUID().uuidString
}
当我尝试访问id时,我会得到一个随机的字母字符串(04F9C67E-C4A5-4870-9C22-F52C7F543AA5),而不是firestore中文档的名称(GeG23o4GNJt5CrKEf3RS)

要访问documentId,我在ObserveObject中使用以下代码:

    class Authenticator: ObservableObject {
        
        @Published var currentUser: UserProfile = UserProfile()
        @Published var user: String = ""    
    
        func getCurrentUser(viewModel: UsersViewModel) -> String {
            guard let userID = Auth.auth().currentUser?.uid else {
                return ""
            }
            
            viewModel.users.forEach { i in
                if (i.userId == userID) {
                    currentUser = i
                }
            }
                    
            print("userId \(currentUser.id ?? "no Id")")
            print("name \(currentUser.name)")
            
            return userID
        }
其中currentUser是一个UserProfile结构。currentUser.name返回正确的值。我做错了什么

currentUser是使用以下方法填充的数组的成员:

func fetchData() {
    db.collection("Users").addSnapshotListener { (querySnapshot, error) in
        guard let documents = querySnapshot?.documents else {
            print("No documents")
            return
        }
        
        self.users = documents.compactMap { (queryDocumentSnapshot) -> UserProfile? in
            
            return try? queryDocumentSnapshot.data(as: UserProfile.self)
        }
    }
}

问题是您正在用新生成的UUID字符串覆盖获取的DocumentID。您应该保持它未初始化,不需要手动设置ID。即使有,也应该仅在对象是从代码创建的情况下设置,而不是从Firestore解码的情况下设置。问题是,您正在用新生成的UUID字符串覆盖获取的DocumentID。您应该保持它未初始化,不需要手动设置ID。即使存在,则仅当对象是从代码创建的,而不是从Firestore解码时,才应设置它。UserProfile结构的id和Firestore中数据的id是分开的。这就是为什么你会看到随机的字母串

我会像下面一样修改您的结构,您可以在初始化时忽略常规的“id”变量,而改为引用documentID

struct UserProfile : Codable, Identifiable {
    var id = UUID() // ID for the struct
    var documentID: String // ID for the post in Database
}

UserProfile结构的id和Firestore中数据的id是分开的。这就是为什么你会看到随机的字母串

我会像下面一样修改您的结构,您可以在初始化时忽略常规的“id”变量,而改为引用documentID

struct UserProfile : Codable, Identifiable {
    var id = UUID() // ID for the struct
    var documentID: String // ID for the post in Database
}

currenetUser
来自哪里?是什么造成的?我们在这里看不到。请编辑问题以显示足够的信息,任何人都可以复制并使用这些信息来重现行为。我刚刚编辑了它。非常感谢。
currenetUser
来自哪里?是什么造成的?我们在这里看不到。请编辑问题以显示足够的信息,任何人都可以复制并使用这些信息来重现行为。我刚刚编辑了它。非常感谢。我正在尝试将其初始化为@DocumentId=UUID?但是我得到了一个编译器错误:属性类型“UUID”与其包装类型“DocumentID”的“wrappedValue”属性不匹配。当我使用
@DocumentID=String?
调试器打印
userId No Id
@seth.eeee时,如果不打印Id或两者都不打印,它是否打印名称?它打印名称,但不打印名称Id@seth.eeee这很奇怪,您正在以以下方式声明id?:
@DocumentID var id:String?
我正在尝试将其初始化为@DocumentID=UUID?但是我得到了一个编译器错误:属性类型“UUID”与其包装类型“DocumentID”的“wrappedValue”属性不匹配。当我使用
@DocumentID=String?
调试器打印
userId No Id
@seth.eeee时,如果不打印Id或两者都不打印,它是否打印名称?它打印名称,但不打印名称Id@seth.eeee这很奇怪,您正在以以下方式声明id:
@DocumentID var id:String?