2017-12-19 2 views
1

Ich möchte ein Modell erstellen, das optionale Werte hat. Ich implementierte flatmap, um das zu erreichen. Knoten sehen so aus und imageUrl existiert nicht immer so.Firebase erstellen Modell, das optionale Werte in Swift

"Post": { 
    "uid": { 
   "autoid"{ 
     "Text": "some text", 
     "Date": "some date", 
     "imageUrl": { 
     autoID1: url1, 
     autoID2: url2 
     } 
    }, 
    "autoid"{ 
     "Text": "some text", 
     "Date": "some date" 
    } 
    } 
    } 

habe ich ein Modell hier

import UIKit 
import Firebase 

extension DataSnapshot { 
    var snapshots: [DataSnapshot] { 
     return children.allObjects.flatMap({ $0 as? DataSnapshot }) 
    } 
    var string: String? { return value as? String } 
    var url: URL? { return string.flatMap({ URL(string: $0) }) } 
    var urls: [URL] { return snapshots.flatMap({ $0.url }) } 
} 

struct Post { 

    let snapshot: DataSnapshot? 

    var Date: String! 
    var imageUrl: [URL]? 
    var Text: String! 

    init(snapshot: DataSnapshot) { 

     self.snapshot = snapshot 
     self.Date = snapshot.child["Date"].string 
     self.imageUrl = snapshot.child["imageUrl"].urls 
     self.Text = snapshot.child["Text"].string 
    } 
} 

aber innerhalb init, Fehler sagt

Wert vom Typ 'DataSnapshot' hat kein Mitglied 'Kind'

Does weiß jemand wie man das löst? Auch ist dies der richtige Weg, um Funktion wie Twitter Post mit mehreren Bildern zu erstellen und manchmal Bilder sind keine, nur Text angezeigt.

+0

DataSnapshot verfügt nicht über das untergeordnete Mitglied https://firebase.google.com/docs/reference/swift/firebasedatabase/api/reference/Classes/DataSnapshot#value. Um also etwas aus dem DataSnapshot extrahieren zu können, könnten Sie diese Idee verwenden: 'wenn Wert = snapshot.value als? [String: Beliebige] { self.Date = Wert ["Date"] als? Schnur ?? "" } ' –

+0

Vielen Dank für den Kommentar, aber diese Methode würde nichts zurückgeben? Zum Beispiel gibt es 5 Posts und einer von ihnen hat keinen Wert, dann sind die Posts, die angezeigt werden, nichts, weil die Werte nicht mit dem Modellobjekt übereinstimmen. Hab ich recht? – Daibaku

+0

Ich verstehe nicht, was du meinst. Der Punkt ist "Kind" ist nicht vorhanden, dann können Sie nicht kompilieren, weil es eine benutzerdefinierte Erweiterung ist, die Sie von dieser Antwort kopiert haben: https://Stackoverflow.com/a/47844462/2450755, überprüfen Sie die letzten Kommentare darin antworte, liege ich falsch? –

Antwort

1

DataSnapshot hat nicht das Mitglied child, doc here. So in der Lage sein, etwas von dem DataSnapshot zu extrahieren, können Sie diese Idee verwenden könnten:

if let value = snapshot.value as? [String: Any] { 
    self.Date = value["Date"] as? String ?? "" 
    self.Text = value.child["Text"] as? String ?? "" 

    // extracting the urls 
    if let urls = value.child["tweetImageUrl"] as? [String:String] { 
    self.imageUrl = urls.flatMap { k,v in URL(string:v) } 
    } 
} 

Beachten Sie, dass: flatMap ist genial, weil die Möglichkeit bieten, alle überspringen automatisch die Iterationen, die einen optionalen Wert zurückgeben .

+0

Vielen Dank für den Kommentar. Ich weiß, wie man so cast, aber wenn es darum geht, Flatmap zu verwenden, haben auch imageurl mehrere Werte, so dass ich nicht herausfinden kann. Hast du eine Idee, das zu lösen? – Daibaku

+0

können Sie den JSON oben beheben? ist nicht gültig –

+0

Richtig Ich werde es als Dankeschön betrachten !! – Daibaku