闭包调用中的额外参数
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)
【讨论】:
以上是关于闭包调用中的额外参数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 的操场上修复“调用中的额外参数 'at'”