我想创建具有可选值的模型。
我实现了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帖子等功能的正确方法,有时图像不是,只显示文本。
答案 0 :(得分:1)
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
非常棒,因为它可以自动跳过返回可选值的所有迭代。