swift - Firebase 在 swift 中创建具有可选值的模型

标签 swift firebase firebase-realtime-database

我想创建具有可选值的模型。 我实现了 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 中,错误提示为

Value of type 'DataSnapshot' has no member 'child'

有人知道怎么解决吗? 这也是创建功能的正确方法,例如带有多个图像的 Twitter 帖子,有时没有图像,只显示文本。

最佳答案

DataSnapshot 没有成员 child,文档 here . 所以为了能够从 DataSnapshot 中提取一些东西,您可以使用这个想法:

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

请注意: flatMap 很棒,因为它提供了自动跳过所有返回可选值的迭代的可能性。

关于swift - Firebase 在 swift 中创建具有可选值的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47882613/

相关文章:

swift - 获取已连接屏幕的名称 Swift

ios - Alamofire - 多部分表单数据 key :value

xamarin - Xamarin 中的 Firebase 通知

android - 用于创建手机身份验证凭据的验证ID在flutter中无效

uitableview - 在 Swift 中的自定义单元格中存储/检索核心数据

ios - 如何在 Swift 3 中创建线程安全变量?

firebase - 不实时加载值

java - 为什么每次我点击另一个 fragment 时,从 firebase 检索的数据都会增加?

ios - 在 firebase 中存储值时无法使用 userID 作为键

javascript - 没有子节点之一的 Firebase 数据检索