当您在 Result 上调用 .map 时,我不太确定您想要实现什么。
swift Result 枚举类型中定义了两种极端情况:
- 要么是
.success<Success>类型
- 或者是
.failure<Failure>类型
查看您的init 扩展名Result:
public extension Result {
init(_ success: Success?, _ failure: Failure?) {
if let success = success {
self = .success(success)
} else if let failure = failure {
self = .failure(failure)
} else {
fatalError("Illegal combination found.\n Success: \(success as Any), Failure: \(failure as Any)")
}
}
}
我可以看到,如果第一个参数(在您的情况下为snapshot)不是nil,则您创建一个.success 结果,否则您使用提供的error 创建一个.failure 结果。如果两者都是nil,则您会以fatalError 崩溃
当您在Result 上调用.map 时,仅当Result 为.success 时才会在内部执行,例如snapshot 不是nil。然而,在你的地图关闭中,你检查是否snapshot.exists,如果不是,你返回nil。但这将是非法的,因为它会导致新的 Result.success 具有 nil 关联值。
您必须检查您希望如何将.success 结果映射到新结果类型的逻辑。
我猜你真正想要的是:如果有snapshot,并且snapshot.exits是真的,那么你想调用完成处理程序使用Result.success,否则使用Result.failure。与此类似的东西:
T.subCollectionRef(of: parentDocument.ref).document(documentID).getDocument { snapshot, error in
if let snapshot = snapshot, snapshot.exists {
completion(Result.success(snapshot))
} else {
Result.failure(error)
}
}