将 documentSnapshot 分配给自定义对象?

Posted

技术标签:

【中文标题】将 documentSnapshot 分配给自定义对象?【英文标题】:Assign dosumentSnapshot to an custom Object? 【发布时间】:2018-11-13 02:48:38 【问题描述】:

首先我看到了答案: here 但对我来说,来自 android 和 angular 的我不得不写这么多代码(在 android 和 angular 中需要一行)加上答案不是最新的,所以想知道现在是否有更好的方法

为了澄清,这里是我的例子:

struct User
  let fistName:String
  let lastName:String

我用 :

检索数据
Firestoer.firestore().collection("users").document('someId').getDocument
   (snapshot,error) in 

问题是如何通过一行代码将快照值分配给用户对象值 - 类似于 user = snapshot -ish 。

【问题讨论】:

文档中已经很好地说明了答案。在自定义对象部分查看Get data with Cloud Firestore。有一个读取 Cities 节点并将每个城市作为 City 对象返回的示例。与您对 User 对象所做的非常相似。 @Jay yeap 我看过了,我不能让它工作,它说:“返回城市(字典:数据)” - 我的对象是简单的“stuct”,我无法制作“ (字典:数据)”——调用。所以我回到 firestore 文档,看看他们是如何设置自定义对象的,但那里(在 addData/custom 对象下)说:“/这在 Swift 中不受支持。请改用值类型。”当他们说“价值”时,我理解它,因为我应该为对象中的每个变量调用“document.get(“firstName”) as String”——也许我理解不正确..? 我认为您忽略了在添加数据中,您定义了一个用于定义每个城市的 City 类。您可以将文档转回 City 对象:。 City(dictionary: 是 city 类的初始化器,它获取传递的字典中的 key: 值对并将它们分配给 City 属性。您可以对 User 做同样的事情,或者简单地 let aUser = User(firstName : fName, lastName: lName) 其中 fName 和 lName 是返回的快照中的值。 但要传递 fName 和 lName,我需要从快照中为每个变量“提取”这些值,无论如何,使用 fName=snapshot.get("firstName") 之类的东西。正确的? - 或者我是否误解了你并且此刻变得越来越愚蠢?:S 这不是这个过程的真正运作方式,它不是迭代;它将快照传递给类以使用快照中的数据填充变量。如果您通过 .value 观察实例化多个用户对象,并且该过程需要在任何平台上发生,您只需要迭代(想想:循环)。 User 类/结构仍然需要定义属性,并且您需要知道正在读取的 firebase 节点的结构。它可以是键:单个字符串的值对,也可以是键:快照对或许多其他结构。 【参考方案1】:

通读您的 cmets,很难了解您到底在哪里遇到了问题。我假设这是因为您不知道如何编写另一个初始化程序,因为您的第一条评论:

`my object is simple "stuct" and I could not make "(dictionary: data)" -call.`

这是您可以使用的初始化程序:

extension User 
    init?(dictionary: [String: Any])
        guard let firstName = dictionary["firstName"] as? String else  return nil 
        guard let lastName = dictionary["lastName"] as? String else  return nil 
    
        self.init(firstName: firstName, lastName: lastName)

【讨论】:

是的,对不起 - 它接缝好像我不清楚我的问题:我要说的是,我正在寻找一个行代码匹配任何对象(在这种情况下为用户)的变量与数据快照,无需添加额外的代码来从快照中提取数据,就像 U 写的那样,U 必须放置两行代码来获取两个变量的值 - 所以现在如果 U 有 20 个类和 10 个变量,那将是 200 个代码行 - 在 angular 和 android 中,我做了很多类似“让用户 = 快照作为用户”之类的事情,就是这样 @pb4now - 没有神奇的一行代码。您需要将快照中返回的数据格式与结构/类的所需属性相关联。使用 Codable 协议可以帮助减少您需要编写的代码量,但您仍然需要编写一些代码。【参考方案2】:

我终于发现,简单的 swift firestore sdk 仍然缺少该功能,但它看起来像是在工作中,您可以在 here 中找到有关此的讨论

...我们的雷达上已经有类似的事情了。本质上,我们希望提供与 Android DocumentSnapshot.toObject 等效的功能。

,希望快点完成……

【讨论】:

您仍然需要使您的类/结构符合 Codable 协议——这意味着您仍然需要编写代码。顺便说一句:您现在不需要这个未来的功能来获得这个功能。去观看this video on Swift CRUD with Firestore 了解如何设置您想要的功能。

以上是关于将 documentSnapshot 分配给自定义对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在代码之外使用 Xcode 4 和 iOS 4.3 将属性分配给自定义 UIControl?

打字稿错误:类型“文档 []”不可分配给自定义类型

在 ColdFusion 中是不是可以将数组传递给自定义标签?

将 HTML 传递给自定义组件

从 UIViewController 将变量传递给自定义 UITableViewCell

将 MongoTemplate 传递给自定义存储库实现