Не удается преобразовать значение типа «Запрос» в тип ожидаемого условия «Bool»

# #swift #firebase #google-cloud-firestore #swiftui

Вопрос:

В моем приложении я пытаюсь создать функцию, в которой, если UID пользователя найден в массиве документа «likedBy», он устанавливает переменную «isLiked» в значение true. У меня есть функция «checkForLikes», которая связана с моим обзорным листом.

Итак, моя цель моего проекта-установить значение»isLiked» равным true, если UID зарегистрированных пользователей («uid») найден в массиве документа.

Однако в функции я получаю ошибку «Не удается преобразовать значение типа»Запрос» в тип ожидаемого условия «Bool»»

PostViewModel.swift

 func checkForLikes(id: String){
        var doc = ref.collection("Posts")
        
        if doc.whereField("likedBy", arrayContains: uid){ /// error is here

            print("Found") /// temporary, eventually to be replaced with setting isLiked = true
        }
}
 

Постоу.свифт

 @State private var isLiked = false
 
 HStack {
                Button(action: {if isLiked == false{
                    postData.addLike(id: post.id)
                    isLiked = true
                } else{
                    postData.unLike(id: post.id)
                    isLiked = false
                }}, label: {
                    Image(systemName: isLiked ? "heart.fill" : "heart")
                        .resizable()
                        .aspectRatio(contentMode: .fill)
                        .frame(width: 20, height: 20)
                        .foregroundColor(isLiked ? .red : .gray)
                }).onAppear(perform: {isLiked = postData.checkForLikes(id: post.id)})
            
                
                Text("(post.likes)")
                    .font(.subheadline)
                    .foregroundColor(.gray)
                    .fontWeight(.light)
                
            }
            
        }
 

Я верю, что я на правильном пути с тем, что у меня есть, за исключением того, что я столкнулся с этой ошибкой. Если я на неверном пути, пожалуйста, дайте мне знать, потому что я впервые делаю что-то подобное.

Ответ №1:

Как вы обнаружили, whereField возвращает a Query . Чтобы что-то сделать с этим запросом, вам нужно будет вызвать что-то подобное getDocuments , чтобы получить результат:

 Firestore.firestore().collection("Posts").whereField("likedBy", arrayContains: uid).getDocuments { snapshot, error in
    if error != nil {
        //handle error
        return
    }
    if snapshot?.documents.count != 0 {
        //it has likes
    }
}
 

Ответ №2:

С помощью моего друга я смог это выяснить.

*PostViewModel.swift

     @State private var isLiked: Bool = false
    @State private var isDisabled: Bool = true
 
  func checkForLikes(id: String, then completion: @escaping (Bool?) -> ()) {
        let collection = ref.collection("Posts")
        let doc = collection.document(id)
        
        doc.getDocument { docSnapshot, err in
            if let err = err {
                print(err)
                completion(nil)
                return
            }
            
            guard let docSnapshot = docSnapshot,
                  let likedBy = docSnapshot.data()?["likedBy"] as? [String] else {
                print("No query snapshot")
                completion(nil)
                return
            }
            
            completion(likedBy.contains(self.uid))
        }
    }
 

PostView.swift

 HStack {
                        Button {
                            if isLiked == false {
                                postData.addLike(id: post.id)
                                isLiked = true
                            } else {
                                postData.unLike(id: post.id)
                                isLiked = false
                            }
                        } label: {
                            Image(systemName: isLiked ? "heart.fill" : "heart")
                                .resizable()
                                .aspectRatio(contentMode: .fill)
                                .frame(width: 20, height: 20)
                                .foregroundColor(isLiked ? .red : .gray)
                        }
                        .disabled(isDisabled)
                        .opacity(isDisabled ? 0.3 : 1)
                        .onAppear {
                            postData.checkForLikes(id: post.id) { isLiked in
                                if let isLiked = isLiked {
                                    withAnimation(.easeInOut(duration: 0.2)) {
                                        isDisabled = false
                                        self.isLiked = isLiked
                                    }
                                }
                            }
                        }