【问题标题】:Assign dosumentSnapshot to an custom Object?将 documentSnapshot 分配给自定义对象?
【发布时间】: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 节点的结构。它可以是键:单个字符串的值对,也可以是键:快照对或许多其他结构。

标签: swift firebase google-cloud-firestore


【解决方案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 了解如何设置您想要的功能。
猜你喜欢
  • 2020-12-15
  • 2021-06-29
  • 2021-12-11
  • 1970-01-01
  • 2019-01-04
  • 2021-07-07
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多