Я пытаюсь добавить новое поле (хэштеги) в свою структуру службы и получаю сообщение об ошибке в Xcode. «Не удается найти« хэштеги »в области действия» ниже мой код.
import SwiftUI
import Firebase
import FirebaseFirestoreSwift
struct FeedTry: Identifiable, Decodable {
@DocumentID var id: String?
let caption: String
let myhashtags: String //Added this new field
let timestamp: Timestamp
let uid: String
var likes: Int
var saves: Int
var user: User?
var didLike: Bool? = false
var didSave: Bool? = false
}
Ниже мой сервисный вид
struct UploadTryService {
func uploadTry(caption: String, completion: @escaping(Bool) -> Void) {
guard let uid = Auth.auth().currentUser?.uid else { return }
let data = ["uid": uid,
"caption": caption,
"hashtags": myhashtags, //getting the error here
"likes": 0,
"saves": 0,
"timestamp": Timestamp(date: Date())
] as [String : Any]
Firestore.firestore().collection("try").document().setData(data) { error in
if let error = error {
print("DEBUG: Failed to upload try with error: \(error.localizedDescription)")
completion(false)
return
}
completion(true)
}
}
}
Проверяя в Интернете и в документации, я не нашел способа исправить это.
Эта проблема является опечаткой и упущением; класс определяется с помощью myhastags, а код ссылается на hashtags. Это два разных ключа - ключ (имя поля) в Firestore должен соответствовать имени свойства класса, иначе он не будет знать, как сопоставить это поле. Также переменная "hashtags": myhashtags, не определена, что вызывает ошибку.





Как и в случае с caption, вы можете передать параметр в uploadTry со значением для myhashtags:
struct UploadTryService {
func uploadTry(caption: String, myhashtags: String, completion: @escaping(Bool) -> Void) { //<-- Here
guard let uid = Auth.auth().currentUser?.uid else { return }
let data = ["uid": uid,
"caption": caption,
"myhashtags": myhashtags, //getting the error here
"likes": 0,
"saves": 0,
"timestamp": Timestamp(date: Date())
] as [String : Any]
Firestore.firestore().collection("try").document().setData(data) { error in
if let error = error {
print("DEBUG: Failed to upload try with error: \(error.localizedDescription)")
completion(false)
return
}
completion(true)
}
}
}
Это означает, что в вашем кальците вам также нужно будет включить его:
uploadTry(caption: "Caption", myhashtags: "Hashtags here", ...)
Другой вариант (в зависимости от того, что вы ищете) — просто передать пустой String:
let data = ["uid": uid,
"caption": caption,
"myhashtags": "",
"likes": 0,
"saves": 0,
"timestamp": Timestamp(date: Date())
Обратите внимание, что в обоих случаях я изменил ключ словаря на myhashtags, поскольку именно так вы назвали его в своей модели. Вы можете выбрать любой ключ — просто убедитесь, что они совпадают.
FeedTryиUploadTryService— разные структуры, поэтомуUploadTryServiceне имеет доступа к свойствам первой. Из вашего текущего кода неясно, откуда вы хотите получитьmyhashtags. Может быть, вы хотите передатьStringв функциюuploadTry, как вы сделали сcaption?