为啥在使用“.count”返回 Swift 下标计数时收到不正确的数组计数?

Posted

技术标签:

【中文标题】为啥在使用“.count”返回 Swift 下标计数时收到不正确的数组计数?【英文标题】:Why am I receiving an incorrect array count when using ".count" to return a Swift subscript count?为什么在使用“.count”返回 Swift 下标计数时收到不正确的数组计数? 【发布时间】:2021-06-17 23:46:58 【问题描述】:

我目前正在创建一个 ios 应用程序,它允许用户添加许多不同的产品,每个产品都添加到 Google Firestore 数组中,类似于下面的示例。

产品

[0]“产品名称:测试,上市价格:5,简要说明:测试,产品 URL:测试,上市有效期至:20/06/2021 12:19” [1]“产品名称:Test2,上市价格:5,简要说明:test2,产品网址:Test2,上市有效期至:26/06/2021 12:19”

作为其中的一部分,我使用以下 Swift 代码返回产品用户列表的下标计数(在上面的示例中为 2),以允许他们查看他们当前列出了多少产品.

  let db = Firestore.firestore()
  let user = Auth.auth().currentUser

  db.collection("users").getDocuments  (snapshot, error) in
     if let error = error 
          print(error)
             return
           else 
         for document in snapshot!.documents 
              let data = document.data()
              let userId = data["uid"] as! String
              if userId == user?.uid 

let group_array = document["product"] as? [String] ?? [""]
let productCount = (group_array.count)

但是,一旦用户最初注册帐户并被重定向到欢迎页面,由于某种原因,每当使用上述语法时,它都会返回“1”,表示用户添加了产品,如下面的示例(但值得注意的是,“1”值显示在应用程序周围的许多其他位置,用户可以在其中查看他们当前的产品数量。

但是,用户在数据库中的数据集中没有产品,如下所示,因此由于应用程序认为 group_array.count 值 > 0,因此在尝试查看此项目时返回意外的 nil,导致应用程序崩溃并因此阻止我将应用程序添加到 TestFlight。

在运行时分析期间,显示单个产品,但返回为空字符串,而这在数据库中不存在。

目前,我的 Xcode 项目中所有与 Firestore 相关的 pod 都设置为相同的 iOS 14.5 部署目标,当我使用新创建的帐户添加另一个产品然后继续删除该产品时,应用程序再次开始工作正如预期的那样,计数反映了正确的“产品”下标总数。

这是我的 pod 配置、我的应用程序还是 Google Firestore SDK 的问题?如果是这样,请提供任何修复或指导来解决/修复此问题?

【问题讨论】:

【参考方案1】:

这一行:

let group_array = document["product"] as? [String] ?? [""]

如果document["product"]nil 或转换为[String] 失败,则将组数组设置为包含单个空字符串。

问题是[""],这不是一个空数组,它是一个包含一个元素的数组(如您所见),该元素是一个空字符串""

也许您打算像这样输入[]

let group_array = document["product"] as? [String] ?? []

这会给你一个空数组。

【讨论】:

非常感谢您的帮助 - 非常感谢,它现在按预期工作。

以上是关于为啥在使用“.count”返回 Swift 下标计数时收到不正确的数组计数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 OleDb ExecuteScalar 方法在查询 COUNT 时返回 Decimal?

为啥在 Swift 的单数返回表达式中使用闭包简写变量必须详尽无遗?

JSON .count 数组在 Swift 4 中总是返回 0

为啥对成员“下标”的引用模棱两可?

Swift:为啥函数有参数和返回值类型?

为啥我的 Swift 按钮在点击时会显示一个蓝色的小方块?