Добавление поля в базу данных firebase firestore в Swift

Я пытаюсь добавить новое поле (хэштеги) в свою структуру службы и получаю сообщение об ошибке в 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)
        }
    }


}

Проверяя в Интернете и в документации, я не нашел способа исправить это.

FeedTry и UploadTryService — разные структуры, поэтому UploadTryService не имеет доступа к свойствам первой. Из вашего текущего кода неясно, откуда вы хотите получить myhashtags. Может быть, вы хотите передать String в функцию uploadTry, как вы сделали с caption?
jnpdx 19.03.2022 22:34

Эта проблема является опечаткой и упущением; класс определяется с помощью myhastags, а код ссылается на hashtags. Это два разных ключа - ключ (имя поля) в Firestore должен соответствовать имени свойства класса, иначе он не будет знать, как сопоставить это поле. Также переменная "hashtags": myhashtags, не определена, что вызывает ошибку.

Jay 20.03.2022 15:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как и в случае с 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, поскольку именно так вы назвали его в своей модели. Вы можете выбрать любой ключ — просто убедитесь, что они совпадают.

Другие вопросы по теме