我是 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/