微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调用可以抛出,但未标记为“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 }

如何解决调用可以抛出,但未标记为“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)
            }
        }
    }
}

error01

error02

lesson taught

解决方法

似乎 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)
            }
        }
    }
}

作为一种风格,简单返回 truefalse 的完成处理程序并不是特别有用,因为它不提供关于什么出错的任何信息当 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 举报,一经查实,本站将立刻删除。