gpt4 book ai didi

swift - 复杂的 firebase 读取查询 - String、Float、Int 和 NSArray

转载 作者:行者123 更新时间:2023-11-28 12:11:32 27 4
gpt4 key购买 nike

我正在尝试从 Firebase 中提取大量变量。并非所有这些都会有任何内容。因此,我需要能够处理 nil 并同时转换为所需的数据类型(例如 Float 和 Int)

目前我在第一个 Float“距离”上遇到错误:

"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

几个问题:

  1. 如何使 Float 转换处理潜在的 nil 情况

  2. 我正在考虑将 Float 作为字符串存储在 Firebase 中,而不是将其包装在 NSNumber 中。你同意吗?

  3. 如果在应用程序中我只需要例如。以下 5 个变量,然后我应该对此进行特定查询 - 还是一次性获取所有变量通常不会花费太多?

  4. 我是否使 Array 或 Map(字典)元素(例如喜欢、评论、图像 URL)正确?

代码:

    // Get data on all activities
func getAllFeedActivities(handler: @escaping (_ activities: [Activity]) -> (Void)) {
var activityArray = [Activity]()


REF_ACTIVITY.observeSingleEvent(of: .value) { (feedActivitySnapshot) in

guard let feedActivitySnapshot = feedActivitySnapshot.children.allObjects as? [DataSnapshot] else { return }


for activity in feedActivitySnapshot {

let activityId = activity.key as String
let name = activity.childSnapshot(forPath: "name").value as? String ?? ""
let description = activity.childSnapshot(forPath: "description").value as? String ?? ""

let userId = activity.childSnapshot(forPath: "userId").value as? String ?? ""
let type = activity.childSnapshot(forPath: "type").value as? String ?? ""
let gearId = activity.childSnapshot(forPath: "gearId").value as? String ?? ""

let distance = Float(activity.childSnapshot(forPath: "distance").value as? String ?? "") as! Float // In meters
let totalElevationGain = Float(activity.childSnapshot(forPath: "totalElevationGain").value as? String ?? "") as! Float // In meters
let elevationHigh = Float(activity.childSnapshot(forPath: "elevationHigh").value as? String ?? "") as! Float // In meters
let elevationLow = Float(activity.childSnapshot(forPath: "elevationLow").value as? String ?? "") as! Float // In meters

let startTime = activity.childSnapshot(forPath: "startTime").value as? String ?? "" // Unix time - seconds
let timeZone = activity.childSnapshot(forPath: "timeZone").value as? String ?? ""
let movingTime = Int(activity.childSnapshot(forPath: "movingTime").value as? String ?? "") as! Int // In seconds
let elapsedTime = Int(activity.childSnapshot(forPath: "elapsedTime").value as? String ?? "") as! Int // In seconds


let likeCount = Int(activity.childSnapshot(forPath: "likeCount").value as? String ?? "") as! Int
let likes = activity.childSnapshot(forPath: "likes").value as? NSArray ?? [""]
let commentCount = Int(activity.childSnapshot(forPath: "commentCount").value as? String ?? "") as! Int
let comments = activity.childSnapshot(forPath: "comments").value as? NSArray ?? [""]
let imageCount = Int(activity.childSnapshot(forPath: "imageCount").value as? String ?? "") as! Int
let imageURLs = activity.childSnapshot(forPath: "imageURLs").value as? NSArray ?? [""]
let defaultImageURL = activity.childSnapshot(forPath: "defaultImageURL").value as? String ?? ""

let activity = Activity(activityId: activityId, name: name, description: description, userId: userId, type: type, gearId: gearId, distance: distance, totalElevationGain: totalElevationGain, elevationHigh: elevationHigh, elevationLow: elevationLow, startTime: startTime, timeZone: timeZone, movingTime: movingTime, elapsedTime: elapsedTime, likeCount: likeCount, likes: likes as! Array<String>, commentCount: commentCount, comments: comments as! Array<String>, imageCount: imageCount, imageURLs: imageURLs as! [String], defaultImageURL: defaultImageURL)
activityArray.append(activity)
}
handler(activityArray)
}
}

最佳答案

1) 如果你想分配一个默认值,这个值应该是

  • String.value 用作?字符串 ?? ""
  • Int.value 用作?诠释?? 0
  • Float.value 用作?漂浮 ?? 0.0
  • Double 使用 .value 作为?双倍的 ?? 0.0
  • Bool 使用 .value 作为? bool ??假的
  • Array 使用 .value 作为? [字符串] ?? []//其中 String 必须是预期的数组类型
  • Dictionary 使用 .value 作为? [字符串:任何] ?? [:]

对于 ArrayDictionary 如果之前没有声明,你必须注释类型

let imageURLs : [String] = ...

但是我建议使用数据库中已有的默认值来声明属性,这样这些值就永远不会为 nil 并且您可以强制解包它们。


其他问题的答案:

2) 不,始终使用适当的类型。

3) 是的,特定查询更有效,始终处理所有值的成本更高。

4) 请参阅 1) - 不要在 Swift 中使用 NSArray/NSDictionary

关于swift - 复杂的 firebase 读取查询 - String、Float、Int 和 NSArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48357190/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com