我有一个在Firestore中更新Book
文档的函数。在稍微查看了Firestore代码之后,我决定禁用错误传播(对于setData(from:completion:)
),我还强制展开了可选的(book
示例的id
属性,该示例标记为@DocumentID
)。显然,如果没有绝对的把握,我不应该这样做。t crash然而,这是我在两种情况下使用!
的理由:
1.强制展开图书的id
属性是可行的,因为如果我从Firestore获取了任何图书,或者使用初始化器创建了一本图书,我总是会在id
字段中填充一个值。据我所知,只有当您用@DocumentID
注解了一个名为name
的字段,并且Firestore文档也有一个名为name
的字段时,才会发生这种情况。这种情况永远不会发生,因为我永远不会将名为id
的字段放在图书文档中。
.setData(from:completion:)
不应该抛出任何一个,因为它只会在Book
示例编码出错时抛出。同样,这种情况也不应该发生,因为首先它被标记为Codable
,而且我添加到数据库的每一本书都将对该结构体进行编码,保证它每次都能工作,如果它工作一次的话。
struct Book: Identifiable, Codable {
@DocumentID var id: String?
var title: String
}
func update(_ book: Book, completion: @escaping (Error?) -> Void) {
let docRef = db.collection("books").document(book.id!) //<<< Force unwrapping
try! docRef.setData(from: book) { error in //<<< Disabling error propagation
completion(error) // Any network related error thrown by Firestore is, however, handled
}
}
我假设这段代码永远不会导致崩溃,这是不是错了?如果是,我很想知道在什么情况下可能会发生错误。
1条答案
按热度按时间sczxawaw1#
(答案是@JoakimDanielson和@Scriptable)如果示例符合
Codable
,并且您有足够的控制来确保数据总是准确的,那么这段代码应该永远不会崩溃,您应该编写单元测试来帮助确保这一点。(@KirilS添加)从技术上讲,如果编码数据缺少字段(如
name
字段),解码可能会失败。发生这种情况的可能性很低,但不要低估服务器上发生“意外”更改的可能性。此外,较新版本的应用可能会将name
属性更改为可选值,如果值为nil
,使用旧版本应用程序的人可能会崩溃。如前所述,几率很低,但永远不会为0,所以不推荐这样做,因为你很容易犯错。而且犯错会对用户体验非常有害。所以没有必要冒这个险。