gpt4 book ai didi

swift - 闭包调用中的额外参数

转载 作者:行者123 更新时间:2023-11-30 10:35:50 25 4
gpt4 key购买 nike

尝试在 iOS 中实现 firebase/firestore,添加以下内容会给我带来 Extra argument in call on (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:我是 swift 的 super 菜鸟

最佳答案

我不太确定当您调用 .map 时您想要实现什么目标关于Result .

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结果,否则你创建一个 .failure提供的结果 error 。如果两者都是nil ,你崩溃了 fatalError

当您调用.map时关于Result ,只有在 Result 时才会在内部执行是 .success ,例如snapshot是非 nil 。然而,在您的 map 闭合中,您检查是否 snapshot.exists如果没有,则返回 nil 。但这将是非法的,因为它将导致新的 Result.successnil关联值。

你必须检查你想要 .success 的逻辑。结果被映射到新的结果类型。

我猜您真正想要的是以下内容:如果有 snapshot snapshot.exits是 true,那么您想使用 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 - 闭包调用中的额外参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58055075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com