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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Firebase创建的模型在swift中具有可选值相关的知识,希望对你有一定的参考价值。

我想创建具有可选值的模型。我实现了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”类型的值没有成员“child”

有谁知道如何解决这个问题?这也是创建具有多个图像的twitter帖子等功能的正确方法,有时图像不是,只显示文本。

答案

DataSnapshot没有成员child,doc 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非常棒,因为它提供了自动跳过返回可选值的所有迭代的可能性。

以上是关于Firebase创建的模型在swift中具有可选值的主要内容,如果未能解决你的问题,请参考以下文章

在展开可选值 uint32 swift 时意外发现 nil

对 swift 中的可选值感到困惑

在隐式展开可选值 AVAUDIO Player SWIFT 时意外发现 nil

Swift学习笔记之----元组与可选值类型

Swift学习笔记之----元组与可选值类型

Swift16-可选链式调用