Swift Firestore не удается передать данные объекту

#swift #google-cloud-firestore

#swift #google-облако-firestore

Вопрос:

Здравствуйте, я пытаюсь проанализировать массив строк в dao. Для этого я создал это:

    func getUsersAbos(){
let userid = Auth.auth().currentUser?.uid
let docRef = db.collection("Users").document(userid!)

docRef.getDocument { (document, error) in
if let city = document.flatMap({
$0.data().flatMap({ (data) in
    return UserBlogObject(channelAbos: data)
})
}) {
print("City: (city)")
} else {
print("Document does not exist")
}
}
}
  

и вот мой Dao:

импортируйте базовый класс UserBlogObject{ var channelAbos = Any

 init(channelAbos: [String]) {
    self.channelAbos = channelAbos


}

init(){

}
  

}

я получаю сообщение об ошибке в этой строке:

         return UserBlogObject(channelAbos: data)
  

Не удается преобразовать значение типа ‘[String: Any]’ в ожидаемый тип аргумента ‘[String]’

пожалуйста, обратите внимание, что я хочу загрузить только массив внутри документа, а не весь документ.

Комментарии:

1. Сначала, пожалуйста, отредактируйте свой вопрос и исправьте отступы и форматирование кода. Пользователям намного проще предоставлять правильные ответы, когда код легко читается. И чтобы ответить на ваш вопрос, Firestore выдает Dictionary of [String : Any] , где строка является ключом для значения, а Any — само значение. Итак, обработайте словарь в вашем методе инициализации вместо массива [String]

2. спасибо, но я хочу получить только массив для ключевых channelAbos в моем документе

3. Затем вы можете использовать [«ключ»] для получения массива. Я опубликую быстрый ответ. Надеюсь, это поможет

Ответ №1:

Вы можете сделать что-то вроде этого. Я не думаю, что есть необходимость чрезмерно усложнять функцию с помощью flatMap() , но вы можете это сделать, если хотите. Вот пример кода, показывающий, как вы могли бы создать свой метод.

 func getUsersAbos() {
    guard let userID = Auth.auth().currentUser?.uid else { return }
    let docRef = db.collection("Users").document(userID)
    docRef.getDocument { (document, error) in
        if error != nil { return }
        guard let data = document?.data() else { return }
        guard let channelAbos = data["channelAbos"] as? [String] else { return }
        let userBlogObject = UserBlogObject.init(channelAbos: channelAbos) // This is the created object. Handle it.
    }
}
  

И ваш класс:

 class UserBlogObject {
    var channelAbos : [String]

    init(channelAbos: [String]) {
        self.channelAbos = channelAbos
    }
}