【问题标题】:Extra argument in call on a closure call闭包调用中的额外参数
【发布时间】:2019-09-23 02:50:21
【问题描述】:

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

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:我是一个超级菜鸟 swift。

【问题讨论】:

  • getDocument的回调有什么类型?如果它是一个 Result 类型,你几乎可以直接传递它

标签: swift firebase google-cloud-firestore swiftui


【解决方案1】:

当您在 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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多