如何解决调用可以抛出,但未标记为“try”且未处理错误/条件绑定的初始化程序必须具有可选类型,而不是“JSON” trylet json: JSON do { json = try JSON(data: data) } catch { // do something with the error } if let json = try? JSON(data: data) { // code that access json goes here }
Sup,各位……我希望你们一切都好。嗯,我写了很短的时间,遇到了这个错误,有人知道如何解决吗?目的是让这个“文件”(即“身份验证服务”)在用户向此聊天应用提供所有信息时与“用户数据服务”进行通信。
AF.request(URL_USER_ADD,method: .post,parameters: body,encoding: JSONEncoding.default,headers: header).responseJSON { (response) in
switch response.result {
case .success(let result):
if let json = result as? Data {
guard let data = response.data else { return }
guard let json = JSON(data: data) else { return }
let id = json["_id"].stringValue
let color = json["avatarColor"].stringValue
let avatarName = json["avatarName"].stringValue
let email = json["email"].stringValue
let name = json["name"].stringValue
}
case .failure(let result):
completion(false)
debugPrint(response.result as Any)
UserDataService.instance.setUserData(id: _id,color: avatarColor,avatarName: avatarName,email: email,name: name)
completion(true)
}
}
}
}
解决方法
似乎 JSON
初始化器 throws
,所以编译器告诉您需要处理这个。
您还试图访问在该块外的 .success
代码块中声明的局部变量,因此它们是未知的。 id
变量的名称也有误。
AF.request(URL_USER_ADD,method: .post,parameters: body,encoding: JSONEncoding.default,headers: header).responseJSON { (response) in
switch response.result {
case .success(let result):
if let json = result as? Data {
guard let data = response.data else { return }
do {
let json = try JSON(data: data)
let id = json["_id"].stringValue
let color = json["avatarColor"].stringValue
let avatarName = json["avatarName"].stringValue
let email = json["email"].stringValue
let name = json["name"].stringValue
UserDataService.instance.setUserData(id: id,color: avatarColor,avatarName: avatarName,email: email,name: name)
completion(true)
} catch {
print(error)
completion(false)
}
}
case .failure(let result):
completion(false)
debugPrint(response.result as Any)
}
}
}
}
作为一种风格,简单返回 true
或 false
的完成处理程序并不是特别有用,因为它不提供关于什么出错的任何信息当 false
返回时,但由于您提到了一个课程,我假设这不是您的设计选择。
这段代码似乎是流行编程课程的一部分,因为我回答了another post。
您老师的代码是错误的,因为它没有处理 JSON
的抛出初始值设定项。也许它适用于某些早期版本的 SwiftyJSON。在任何情况下@Paulw1 的回答都能让你找到大部分方法。问题在于,如果周围的函数没有标记为 try JSON(data: data)
,那么简单地调用 throws
就会出现问题。鉴于您已经解决了一些其他错误(例如未能解开可选项),这显然是可以接受的,因为这是您老师的代码所做的,您可以这样做:
guard let json = try? JSON(data: data) else { return }
这里是关于 try
的交易及其变体。
try
对于try
,必须将周围的函数标记为throws
,在这种情况下,抛出的任何错误都会传播到调用者,或者您必须在{{1} }.
因此,如果我们假设您的函数名为 do...catch
,则需要声明如下:
foo
或者您必须像这样将 func foo(...) throws -> ReturnTypeIfAny
包裹在 try
中:
do...catch
let json: JSON
do {
json = try JSON(data: data)
}
catch {
// do something with the error
}
try?
如果可以抛出的东西确实抛出,则返回 try?
。所以你可以像处理任何可选的返回类型一样处理它。
nil
或
guard let json = try? JSON(data: data) else { return }
if let json = try? JSON(data: data)
{
// code that access json goes here
}
您可能在大多数情况下都希望避免这种情况。 try!
完全忽略了抛出错误的可能性,如果抛出则崩溃。 仅在您确定即使您正在调用的函数标记为 try!
,但您知道它实际上不能 throws
时使用它。
当它被标记为 throw
时可能会发生这种情况,因为它是 throws
一致性的一部分,但是你调用的是你写的东西,在你的情况下,你知道它没有永远不要扔。在这种情况下,protocol
是可以的。但是,如果您调用的不是您的代码,或者您有疑问,请始终假设任何标记为 try!
的函数实际上都可以抛出,因此您需要处理它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。