程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么将带有子类型 B 的某些元素的 A 类型数组发送到 Firestore 强制全部发送到 A?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为什么将带有子类型 B 的某些元素的 A 类型数组发送到 Firestore 强制全部发送到 A??

开发过程中遇到为什么将带有子类型 B 的某些元素的 A 类型数组发送到 Firestore 强制全部发送到 A?的问题如何解决?下面主要结合日常开发的经验,给出你关于为什么将带有子类型 B 的某些元素的 A 类型数组发送到 Firestore 强制全部发送到 A?的解决方法建议,希望对你解决为什么将带有子类型 B 的某些元素的 A 类型数组发送到 Firestore 强制全部发送到 A?有所启发或帮助;

注意:这个问题的环境是在 Swift 和 Xcode 12.5 中。我无法确认这种情况是否发生在此环境之外。

虑类 A 和子类 B: A,其中 B 有一些 A 没有的属性。

class A {
  var a
  // ...
}

class B: A {
  var b
  // ...
}

假设我有一个 A 数组,其中包含一些 B 类型的元素。

var array: [A] = [A(),B(),A()]

我把这个数组放在一个可以发送到 Firestore 的对象中:

class Model: Codable {
  var x: [A]
}

我将此数组发送到文档下的 Firestore,使用 x 中的值填充 array

someReference.setData(from: Model(x: array))

但是,在 Firestore 控制台中,数据都是 A 类型,并且属性 b 不存在于数据库中的任何位置。

这是有意的行为吗?为什么会出现这种情况?或者,我在构建/发送这些数据时做错了什么?

解决方法

您可以通过将每个对象单独上传到 Firestore 来实现,如果需要,可以先向下转换对象:

class A: Codable {
    var a: String?

    private enum CodingKeys : String,CodingKey {
        case a = "a"
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(a,forKey: .a)
    }
}

class B: A {
    var b: String?
}

var array: [A] = [A(),A(),B()]

for item in array {
    if item is B {
        let downcast_item = item as! B
        someReference.setData(from: downcast_item)
    } else if item is A {
        someReference.setData(from: item)
    }
}

大佬总结

以上是大佬教程为你收集整理的为什么将带有子类型 B 的某些元素的 A 类型数组发送到 Firestore 强制全部发送到 A?全部内容,希望文章能够帮你解决为什么将带有子类型 B 的某些元素的 A 类型数组发送到 Firestore 强制全部发送到 A?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。