有人能告诉我,我的代码有什么问题吗?或者我如何分解此方法以进行调试?我有最新的xCode v.14.1(14 B47 b),不知何故,它在v.13.4.1上编译-_-
extension WebSocket {
@available(macOS 10.15, *) func connectUntilBody(write: String? = nil ) async throws -> Data? {
try await withCheckedThrowingContinuation { continuation in // <-- Type of expression is ambiguous without more context
var result: Result<Data?, Error> = .success(nil)
onEvent = { [weak self] event in
if let body = event.body {
result = .success(body)
let group = DispatchGroup()
if let write = write {
group.enter()
self?.write(string: write) {
group.leave()
}
}
group.notify(queue: .main) {
self?.disconnect()
}
} else if case let .error(error) = event {
error.flatMap { result = .failure($0) }
self?.disconnect()
} else if case .cancelled = event {
continuation.resume(with: result)
}
}
connect()
}
}
}
1条答案
按热度按时间7gcisfzg1#
主要问题有:
1.如果将函数标记为
throws
,则必须将错误标记为resume
。1.您必须
resume
* 满意路径 * 中的数据。DispatchGroup
没有意义。因为continuation
是async
,所以你可以在write
闭包中使用resume
。1.您还必须确保
resume
只被调用一次。要回答这个问题:
如果编译器不能推断出
continuation
的类型,则必须对其进行注解。但是,您也可以调用
continuation.resume(returning:)
来返回数据,调用continuation.resume(throwing:)
来返回错误(请参阅问题1)。你还应该返回非可选的
Data
,否则就是一个错误。顺便说一下,这是Result
类型的目标。