Получение значения базы данных Firebase Swift Xcode - PullRequest
0 голосов
/ 06 мая 2020

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

Мой код:

 override func viewDidLoad() {

        super.viewDidLoad()
        loadCarte()

}

func loadCarte(){
        var ref: DatabaseReference!

        ref = Database.database().reference()
        let userID = Auth.auth().currentUser?.uid
        ref.child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
          // Get user value
          let value = snapshot.value as? NSDictionary
          let Carte = value?["carte"] as? String ?? ""
            self.carteButton.setTitle(Carte + " cartes", for: .normal)
          // ...
          }) { (error) in
            print(error.localizedDescription)
        }
    }

Мне удается восстановить другие значения, но не это, может это исходить из тот факт, что это целое число?

Спасибо заранее

EDIT: моя Json структура типа пользователя в разделе users> userID

    {
  "carte" : 10,
  "email" : "apperce.v@gmail.com",
  "username" : "vicro87000"
}

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Вы сохраняете значение numeri c в свойстве carte, поэтому вы приводите значение numeri c к строке. В Swift нельзя преобразовать число в такую ​​строку.

Эксперт по Swift сказал мне, что это лучший способ sh сделать то же самое:

let carte = value?["carte"].flatMap { $0 as? Int } .map { String($0) }

Здесь операция flatMap разворачивает значение int из опционального, в котором оно находится. Затем map преобразует значение int в строку. Вызов инициализатора String в закрытии map необходим, потому что Swift Ints не могут быть преобразованы в типы String.

1 голос
/ 06 мая 2020

Предполагается, что ваша структура:

uid_0
  "carte" : 10,
  "email" : "apperce.v@gmail.com",
  "username" : "vicro87000"

И вы хотите прочитать дочерние значения, вот код для чтения этого узла

let thisUser = ref.child("users").child(uid)
thisUser.observeSingleEvent(of: .value, with: { snapshot in
    let email = snapshot.childSnapshot(forPath: "email").value as? String ?? "No email"
    let userName = snapshot.childSnapshot(forPath: "username").value as? String ?? "No username"
    let carte = snapshot.childSnapshot(forPath: "carte").value as? Int ?? 0
    print(email, username, carte)
})

Итак, carte var будет быть Int и может использоваться в метке

myTextField.text = "\(carte)"

или преобразовываться в String

let myIntAsString = String(carte)

this

as? Int ?? 0

называется оператором объединения nil и защищает ваш код в случае, если установлено значение nil, на самом деле оно установлено на 0, поэтому ваш код не трескается sh.

В качестве примечания, это опасно

userID!

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

Лучше сделать

guard let user = Auth.auth().currentUser else {return}
let uid = user.uid
...