# #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
}
}
}
}