2016-08-25 24 views
7

Dostaję taki błąd: „Typ«Każdy»ma członków dolny” podczas próby uruchomienia tego bloku kodu:Type „Każdy” ma indeksy dolne członków (Firebase)

init(snapshot: FIRDataSnapshot) { 
    key = snapshot.key 
    itemRef = snapshot.ref 

    if let postContent = snapshot.value!["content"] as? String { // error 
     content = postContent 
    } else { 
     content = "" 
    } 
} 

I zostały poszukiwania dla odpowiedzi i nie mógł znaleźć rozwiązania, które rozwiązałoby ten problem w FireBase. Jak rozwiązać ten błąd?

+2

Wygląda na to, migawka ma wartość prymitywną, co oznacza 'snapshot.value' nie zwraca słownika. Sprawdź, czym jest 'klucz' (nie zdziwiłbym się, gdyby to był" content ") i czym jest JSON w miejscu, które obserwujesz. –

+0

co drukuje "print (snapshot.value! .dynamicType)? – vacawama

+0

@vacawama drukuje, że jest to NSDictionary –

Odpowiedz

17

snapshot.value ma typ Any?, więc musisz przesłać go do leżącego pod nim typu, zanim będzie można go indeksować. Od snapshot.value!.dynamicType jest NSDictionary, należy użyć opcjonalnego obsady as? NSDictionary ustalić typ, a następnie można uzyskać dostęp do wartości w słowniku:

if let dict = snapshot.value as? NSDictionary, postContent = dict["content"] as? String { 
    content = postContent 
} else { 
    content = "" 
} 

Albo można zrobić to jako jedną wkładką:

content = (snapshot.value as? NSDictionary)?["content"] as? String ?? "" 
+0

dziękuję bardzo! działa idealnie –

+0

Jak uzyskać wartości węzłów podrzędnych? –

2

Mam również kodeparty, który pozwala na dostęp do wartości węzłów podrzędnych. Mam nadzieję, że to pomaga:

if let snapDict = snapShot.value as? [String:AnyObject] { 

      for child in snapDict{ 

       let shotKey = snapShot.children.nextObject() as! FIRDataSnapshot 

       if let name = child.value as? [String:AnyObject]{ 

        var _name = name["locationName"] 
        print(_name) 
       } 

      } 

     } 

poważaniem Nazar Medeiros