闭包调用中的额外参数

Posted

技术标签:

【中文标题】闭包调用中的额外参数【英文标题】: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 类型,你几乎可以直接传递它 【参考方案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)
    

【讨论】:

以上是关于闭包调用中的额外参数的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:随机“调用中的额外参数”错误

调用中的额外参数 userinfo

Swift 中的额外参数调用

如何在 swift 的操场上修复“调用中的额外参数 'at'”

为啥我在 Swift 中的初始化程序不断收到“调用中的额外参数”

Swift 2中的“调用中的额外参数'错误'”错误[重复]