提问人:Tardik 提问时间:9/1/2023 最后编辑:HangarRashTardik 更新时间:9/1/2023 访问量:63
尝试从闭包访问返回的字符串时出现“无法将类型'()'的返回表达式转换为返回类型'String'”编译器错误
"Cannot convert return expression of type '()' to return type 'String'" compiler error when trying to access returned string from closure
问:
func requestList(completionParameter: @escaping (String) -> String ) {
let url = URL(string: "https://www.google.de")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
let message = error.localizedDescription
completionParameter(message)
}
if let response = response {
let message = response.mimeType!
completionParameter(message)
}
}
task.resume()
}
func printer() -> String {
let dspmsg = requestList(completionParameter: { message1 -> String in
let t = type(of: message1)
print(t)
return message1
})
return dspmsg
返回的值显然是,但是当我检查闭包内部的内容时,我总是得到预期的文本,并且它的类型是 .在使用该函数之前,我尝试直接打印闭包的返回值,这导致我犯了同样的错误。dspmsg
Void
message1
completionParameter
requestList
String
printer()
我的目标是请求网站数据并在关闭之外使用它。
我怀疑返回发生在完成之前。
但正如我所说,直接打印返回并规避时序问题,打印一个空元组,据我所知,它等于 .printer()
completionParameter
Void
答:
0赞
Leo Dabus
9/1/2023
#1
你应该看看 Swift 中的 Async/Await 并发。您可以尝试以下操作:
- 创建异步方法并使用 URLSession 异步方法
data(from: URL)
func requestList() async -> String {
let url = URL(string: "https://www.google.de")!
do {
let (_, response) = try await URLSession.shared.data(from: url)
guard let mime = response.mimeType else {
throw URLError(.unknown)
}
return mime
} catch {
return error.localizedDescription
}
}
- 将打印机方法也声明为异步:
func printer() async -> String {
let dspmsg = await requestList()
print(dspmsg)
return dspmsg
}
- 然后,您可以使用 await 调用它
Task {
let string = await printer() // text/html
}
评论
1赞
Tardik
9/1/2023
这个答案以及链接的文章帮助我解决了我的问题。
评论
requestList
requestList
Cannot convert () to String