2017-01-13 8 views
1

Ich versuche, aus der Datenbank zu lesen und die Werte in ein Array von Zeichenfolgen zu platzieren. Wenn ich jedoch versuche, die Werte in ein Array zu pushen, drucke das Array, in dem die App abstürzt.Werte aus der Datenbank in Array lesen

var pets: [String]? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let userRef = FIRDatabase.database().reference().child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("pets") 
    userRef.observeSingleEvent(of: .value, with: { snapshot in 
     if let snap = snapshot.value as? Bool { 
      print("no values") 
     } else if let snap = snapshot.value as? NSDictionary { 
      for value in snap { 
       print(value.key as! String) // Prints out data in the database 
       self.pets?.append(value.key as! String) 
      } 
      print(self.pets!) 

     } 
    }) 

Weiß jemand, warum die print(value.key as! String) druckt die Daten aber dann, wenn ich das Array mit unexpectedly found nil while unwrapping an Optional value die App-Abstürze ausdrucken?

Antwort

1

Sie initialisieren niemals pets. Sie deklarieren es als optional, weisen ihm jedoch keinen Wert zu. Warum Ihr Code nicht auf das folgende ändern:

var pets = [String]() // start with an empty array 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let userRef = FIRDatabase.database().reference().child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("pets") 
    userRef.observeSingleEvent(of: .value, with: { snapshot in 
     if let snap = snapshot.value as? Bool { 
      print("no values") 
     } else if let snap = snapshot.value as? NSDictionary { 
      for value in snap { 
       print(value.key as! String) // Prints out data in the database 
       self.pets.append(value.key as! String) 
      } 
      print(self.pets) 

     } 
    }) 
+0

Das schien es zu beheben, ich muss viel lernen ... Danke. – MarksCode

+0

FYI - Ich fordere Sie dringend auf, Zeit zu verbringen, indem Sie http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found-nil-while-unwrapping-an-optional-values ​​lesen = 1 | 6.4447 – rmaddy

1

Ihr Array nil ist, wenn Sie versuchen, kraft Abwickeln mit:

print(self.pets!) 

Wie Sie self.pets?.append() verwenden Sie haben kein Problem weil Sie die Verkettung von Optionals verwenden, aber Ihr Array tatsächlich zu dieser Zeit nil ist, weil Sie vergessen haben, es zu initialisieren, bevor Sie es verwenden. Wenn Sie stattdessen self.pets!.append() verwenden, wird stattdessen ein Laufzeitfehler angezeigt.

So wie @rmaddy vorschlagen, können Sie das Array am Anfang oder nur innerhalb Ihrer viewDidLoad() initialisieren, es liegt an Ihnen.

Ich hoffe, das hilft Ihnen.