Array Append равен нулю, в то время как операторы печати и блок завершения имеют значения [duplicate]

String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

Убедитесь, что вы понимаете, почему. Это потому, что сравнение == сравнивает только ссылки; equals() метод сопоставляет содержимое по символу.

Когда вы вызываете new для a и b, каждый получает новую ссылку, указывающую на "foo" в таблице строк. Ссылки разные, но контент один и тот же.

0
задан K.Pilch 28 October 2017 в 11:50
поделиться

1 ответ

Обновление: когда вы вызываете .observeSingleEvent, вы вызываете метод асинхронно. Это означает, что метод начнет работать, но ответ придет позже и не будет блокировать основной поток. Вы вызываете этот метод, но данных пока нет, и поэтому вы возвращаете пустой словарь.

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

func downloadDailyQuote(completion: @escaping ([String:String]) -> Void) {
   let reference = Database.database().reference().child("daily")

   reference.observeSingleEvent(of: .value) { (snap) in

      if let dictionaryWithData = snap.value as? [String:String] {
         completion(dictionaryWithData) 
      } else {
         completion(["" : ""])
      }        
    }
 }
1
ответ дан a.afanasiev 15 August 2018 в 14:49
поделиться