在闭包调用中的额外参数

时间:2019-09-23 02:50:21

标签: swift firebase google-cloud-firestore swiftui

尝试在iOS中实现firebase / firestore,添加以下内容使我在Extra argument in call上遇到(snapshop , error)错误。

T.subCollectionRef(of: parentDocument.ref).document(documentID).getDocument { snapshot, error in
    completion(Result(snapshot, error)
        .map { snapshot in snapshot.exists ? .init(snapshot: snapshot) : nil }
    )
}

https://github.com/sgr-ksmt/SwiftUI-Firebase-Todo/blob/master/FireTodo-w-SwiftUI/Sources/Models/FirestoreModel.swift#L44

PS:我是个超级菜鸟

1 个答案:

答案 0 :(得分:0)

当您在.map上致电Result时,我不太确定要实现什么。

在快速Result枚举类型中定义了两种边缘情况:

  • 它的类型为.success<Success>
  • 或它的类型为.failure<Failure>

看看您的init的{​​{1}}扩展名:

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结果与提供的.failure。如果两者均为error,您将以nil

崩溃

当您在fatalError上调用.map时,此操作仅在ResultResult的情况下在内部执行,例如.success是非snapshot。但是,在关闭地图时,您检查是否为nil,如果不是,则返回snapshot.exists。但这将是非法的,因为它会导致新的nil具有关联的值Result.success

您必须检查如何将nil结果映射到新结果类型的逻辑。

我想您真正想要的是以下内容:如果存在.success snapshot为真,那么您想要使用snapshot.exits调用完成处理程序,否则使用Result.success调用完成处理程序。与此类似的东西:

Result.failure