英文:
Cannot convert value of type '[String : Any]' to closure result type 'Void' in Swift
问题
以下是您的代码的翻译部分:
有没有建议,为什么我的代码会返回错误(我已经提供了我创建的函数的详细信息,是什么导致了这个错误:
>无法将类型为'[String : Any]'的值转换为闭包结果类型'Void'
let tes = fetchUser(completionHandler: { baseData, error in
if let baseData = baseData {
let parm_key: String = baseData["parm_key"] as! String
return baseData
}
})
print(tes)
func fetchUser(completionHandler: @escaping ([String: Any]?, Error?) -> [String: Any]) {
...
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else { return }
let stringData = String(data: data, encoding: .utf8)!
let encryptedResult = stringData.data(using: .utf8)!
if let data = Data(base64Encoded: encryptedResult) {
let firstDecoded = String(data: data, encoding: .utf8)!
let countDrop = Int(String(firstDecoded.prefix(2))) ?? 0
let base64EncodedData = firstDecoded.dropFirst(countDrop + 2)
if let secondData = Data(base64Encoded: String(base64EncodedData)) {
let secondDecoded = Data(String(data: secondData, encoding: .utf8)!.utf8)
do {
// 确保这个 JSON 是我们期望的格式
if let json = try JSONSerialization.jsonObject(with: secondDecoded, options: []) as? [String: Any] {
completionHandler(json, nil)
}
} catch let error as NSError {
print("加载失败:\(error.localizedDescription)")
}
}
}
}
task.resume()
}
请注意,代码中的return baseData
可能会导致错误,因为fetchUser
函数的闭包返回类型是([String: Any]?, Error?) -> [String: Any]
,而不是Void
。您可能需要更改代码以适应函数的返回类型。
英文:
Any suggestion why my code return error( I already provide details of the function I've made what cause that error:
>Cannot convert value of type '[String : Any]' to closure result type 'Void'
let tes = fetchUser(completionHandler: { baseData, error in
if let baseData = baseData {
let parm_key : String = baseData["parm_key"] as! String
return baseData
}
})
print(tes)
func fetchUser(completionHandler: @escaping ([String:Any]?, Error?) -> [String:Any]) {
...
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else { return }
let stringData = String(data: data, encoding: .utf8)!
let encryptedResult = stringData.data(using: .utf8)!
if let data = Data(base64Encoded: encryptedResult) {
let firstDecoded = String(data: data, encoding: .utf8)!
let countDrop = Int(String(firstDecoded.prefix(2))) ?? 0
let base64EncodedData = firstDecoded.dropFirst(countDrop + 2)
if let secondData = Data(base64Encoded: String(base64EncodedData)) {
let secondDecoded = Data(String(data: secondData, encoding: .utf8)!.utf8)
do {
// make sure this JSON is in the format we expect
if let json = try JSONSerialization.jsonObject(with: secondDecoded, options: []) as? [String: Any] {
completionHandler(json, nil)
}
} catch let error as NSError {
print("Failed to load: \(error.localizedDescription)")
}
}
}
}
task.resume()
}
答案1
得分: 1
完成处理程序闭包接受两个参数,但不返回任何值。您需要删除return
行,并可能更新闭包外部范围中的另一个变量以获取所需的值。该错误意味着该函数不期望返回任何内容(void),但却返回了一个字典(baseData)。
在您的示例中,tes
是否具有您需要的值?如何处理这个问题将取决于fetchUser()
的定义方式,但它可能不会直接返回值。您必须将其分配给完成处理程序中的某个东西。
var returnedBaseData = [String:Any]()
fetchUser(completionHandler: { baseData, error in
if let baseData = baseData {
returnedBaseData = baseData
}
})
英文:
The completion handler closure takes two arguments but does not return a value. You need to remove the return
line and perhaps update another variable (in the scope outside the closure) with the needed value. The error means that the function is not expecting to return anything (void), yet a dictionary (baseData) is returned.
In your example, does tes
have the value you need? How to handle this will depend on how fetchUser()
is defined, but it probably doesn’t return the value directly. You must assign it to something in the completion handler.
var returnedBaseData = [String:Any]()
fetchUser(completionHandler: { baseData, error in
if let baseData = baseData {
returnedBaseData = baseData
}
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论