2017-12-19 7 views
1

オプションの値を持つモデルを作成したいと思います。 これを実現するためにflatmapを実装しました。このようなノードの外観であり、毎回imageUrlは存在しません。スウィフトで任意の値を持つモデルを作成する

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

は、私はここでモデルを作成し

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 
    } 
} 

しかしinitの内側に、エラーがタイプの

値を言う 'DataSnapshot' はメンバー '子'

んを持っていません誰もこれを解決する方法を知っていますか? また、複数の画像を含むツイッターポストのような機能を作成するための正しい方法です。画像が表示されない場合もあり、テキストのみが表示されます。

+0

DataSnapshotにはメンバーの子がありません(https://firebase.google.com/docs/reference/swift/firebasedatabase/api/reference/Classes/DataSnapshot#value)。したがって、DataSnapshotから何かを抽出するには、このアイデアを使用します。 'もしlet value = snapshot.value as? [String:Any] { self.Date = value ["Date"] as?文字列?? "" } ' –

+0

コメントありがとうございますが、このメソッドは何も正しく戻りませんか?たとえば、5つの投稿があり、そのうちの1つに価値がない場合、値がモデルオブジェクトと一致しないため、表示する投稿は何も表示されません。私は正しいですか? – Daibaku

+0

あなたは何を意味するのか分かりません。ポイントは 'child''ではないので、コンパイルできません。これは、この回答からコピーしたカスタム拡張です:https://stackoverflow.com/a/47844462/2450755、その最後のコメントを確認してください答え、私は間違っていますか? –

答えて

1

DataSnapshotは、メンバーがchild、doc hereではありません。なぜなら、自動的に任意の値を返すされているすべての反復をスキップする可能性を提供 flatMap素晴らしいです:があること

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) } 
    } 
} 

注: だから、DataSnapshotから何かを取り出すことができるように、あなたはこのアイデアを使用する場合があります。

+0

コメントありがとうございます。私はそのようにキャストする方法を知っていますが、フラットマップを使用する場合は、imageurlに複数の値があるため、わかりません。これを解決する考えはありますか? – Daibaku

+0

上記のJSONを修正することはできますか?有効ではありません –

+0

私はそれがあなたに感謝を考慮するよ! – Daibaku

関連する問題