gpt4 book ai didi

ios - 如何在不允许可选值的情况下使用 Firebase

转载 作者:搜寻专家 更新时间:2023-11-01 06:16:42 24 4
gpt4 key购买 nike

我是 iOS 开发的新手,我知道在初始化对象时允许可选值不是“好公民”技术。话虽如此,我读到过始终设置值是一种很好的做法,如下所示:

class Item{
var name: String
var color: String
init(name: String, color: String) {
self.name = name
self.color = color
}
}

这看起来很整洁,但是我怎样才能使用 Firebase 做类似的事情呢?看看我到目前为止得到了什么:

private func loadPosts(){
databaseHandle = ref.child("users/\(self.user.uid)/posts").observe(.value, with:{(snapshot) in
var newPosts = [Post]()

for itemSnapShot in snapshot.children {
let post = Post(snapshot: itemSnapShot as! FIRDataSnapshot)
newPosts.append(post!)
}
self.posts = newPosts
self.tableView.reloadData()
})
}

这个人被放置在我的 PostsViewController 中,我有我的 TableView 。这是我的模型:

class Post {
var ref: FIRDatabaseReference?
var title: String?
var answer: String?
var contentUrl: String?
var photoUrl: String?
var createdAt: String?
var feeling: String?
var kind: String?
var text: String?
var uid: String?
var measurements: Dictionary<String, String>?

//MARK: Initialization
init?(snapshot: FIRDataSnapshot){
ref = snapshot.ref

let data = snapshot.value as! Dictionary<String, Any>

title = data["title"]! as? String
answer = data["answer"] as? String
contentUrl = data["content_url"] as? String
photoUrl = data["photo_url"] as? String
createdAt = data["created_at"] as? String
feeling = data["feeling"] as? String
kind = data["kind"] as? String
text = data["text"] as? String
uid = data["uid"] as? String
measurements = data["measurements"] as? Dictionary<String, String>
}
}

我不知道确切的原因,但这些问号感觉不太对,我时不时会遇到一些 nil 指针错误,我认为我应该能够通过使用“好公民”技术来避免这种情况。

那么,有人知道如何按照 Swift 最佳实践使用 Firebase 吗?

最佳答案

要么你希望你的 Post 类的属性为 nil,要么你不想。

如果你这样做了,那很好。您发布的代码允许其中任何一个为零。您只需在每次需要时安全地访问每个属性。

如果您不这样做,则不要将它们设为可选。然后在您的 init 中,如果快照中没有值,您需要通过为每个属性提供默认值来确保没有任何属性设置为 nil

class Post {
var ref: FIRDatabaseReference
var title: String
var answer: String
var contentUrl: String
var photoUrl: String
var createdAt: String
var feeling: String
var kind: String
var text: String
var uid: String
var measurements: [String : String]

//MARK: Initialization
init?(snapshot: FIRDataSnapshot) {
if let data = snapshot.value as? [String : Any] {
self.ref = snapshot.ref

title = data["title"] as? String ?? ""
answer = data["answer"] as? String ?? ""
contentUrl = data["content_url"] as? String ?? ""
photoUrl = data["photo_url"] as? String ?? ""
createdAt = data["created_at"] as? String ?? ""
feeling = data["feeling"] as? String ?? ""
kind = data["kind"] as? String ?? ""
text = data["text"] as? String ?? ""
uid = data["uid"] as? String ?? ""
measurements = data["measurements"] as? [String : String] ?? [:]
} else {
return nil
}
}
}

请注意这是如何确保有一个正确的快照。如果快照中没有值,请注意如何为每个属性设置默认值。显然,您可以指定任何您希望的默认值。我以空字符串为例。

即使您希望属性为nil,您也应该至少像上面的代码一样更新您的代码以检查有效的快照。

当然,您可以进行组合,其中一些属性不能为 nil 而另一些可以。这取决于您的需求。

关于ios - 如何在不允许可选值的情况下使用 Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43266409/

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