Как я могу сохранить словарь в Firebase в Swift? - PullRequest
0 голосов
/ 08 марта 2020

У меня есть словарь типа [Int: Int], который я пытаюсь сохранить в firebase. Моя функция для записи в firebase выглядит следующим образом:

func writeToFirebase() {
    setScoreToBadge()
    setScoreToVehicle()
    if GameManager.instance.getUsername() != "" {
        self.ref?.child("user").child(
                GameManager.instance.getUsername()
        ).setValue(
            [
                "email": GameManager.instance.getEmail(),
                 "userNameLowered": GameManager.instance.getUsername().lowercased(),
                 "userName": GameManager.instance.getUsername(),
                 "topScore": GameManager.instance.getTopScores()[0],
                 "topScores": GameManager.instance.getTopScores(),
                 "totalCash": GameManager.instance.getTotalCash(),
                 "friends": GameManager.instance.getFriendsAdded(),
                 "achievements": GameManager.instance.getAchievementsCompletedBool(),
                 "badge": GameManager.instance.getBadgeLevel(),
                 "scoreBadgeDictionary" : GameManager.instance.getTopScoreWithBadgeDictionary(),
                 "scoreVehicleDictionary" : GameManager.instance.getTopScoreWithVehicleDictionary()
            ])
    } else {
        print ("Not signed in, score not saved to firebase")
    }
}

У меня проблема с scoreBadgeDictionary и , scoreVehiceDictionary. GameManager.instance.getTopScoreWithBadgeDictionary() - это словарь типа [Int: Int], а GameManager.instance.getTopScoreWithVehicleDictionary() - это словарь типа [Int: String]. Если я попытаюсь запустить эту функцию, она вызовет sh.

Есть ли способ преобразовать словарь в формат, который я могу сохранить в firebase?

1 Ответ

1 голос
/ 08 марта 2020

Эта проблема заключается в том, как определяется массив. Простой пример

let myArray = ["some_key": "some_value"]

определяется как массив [String: String]

, а

let myArray = ["some_key": 5]

определяется как массив [String: Int]

Ваш массив

[
"email": GameManager.instance.getEmail(),
"userNameLowered": GameManager.instance.getUsername().lowercased(),
.
.
"scoreBadgeDictionary" : ["some key": "some value"]
]

, где, я предполагаю, GameManager.instance.getTopScoreWithBadgeDictionary () возвращает словарь.

Так что массив не соответствует [String: String] или [String: Int]. Однако он соответствует более обобщенному c [String: Any], так что это то, что вам нужно, чтобы «сообщить» переменную.

let myArray: [String: Any] = [
     "email": "Hello",
     "userNameLowered": "hello",
     "scoreBadgeDictionary" : [1: "some score"],
     "scoreVehicleDictionary" : [2: "some vehicle"]
]

Однако, и это важный бит, словари, возвращаемые в getTopScoreWithVehicleDictionary, который является [Int: String] или [Int: Int], не будет работать с Firebase.

Ключи Firebase должны быть строками , поэтому попытайтесь написать это [1: «Hello, World] будет создавать sh. Принимая во внимание, что массивы в Firebase имеют номера c индексов и

, если данные выглядят как массив, Firebase будет отображать их как массив.

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

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