无法使用完成处理程序进行抛出操作

2024-03-08

我正在尝试添加一个throws使用完成处理程序添加到我现有的函数,但我不断收到警告说no calls throwing functions occur within try expression。在我抛出错误的部分中,我收到一条错误消息

从“() throwing -> Void”类型的抛出函数到非抛出函数类型的转换无效。

enum LoginError: ErrorType {
    case Invalid_Credentials
    case Unable_To_Access_Login
    case User_Not_Found
}

@IBAction func loginPressed(sender: AnyObject) {

    do{
        try self.login3(dict, completion: { (result) -> Void in

            if (result == true)
            {
                self.performSegueWithIdentifier("loginSegue", sender: nil)
            }
        })
    }
    catch LoginError.User_Not_Found
    {
        //deal with it
    }
    catch LoginError.Unable_To_Access_Login
    {
        //deal with it
    }
    catch LoginError.Invalid_Credentials
    {
        //deal with it
    }
    catch
    {
        print("i dunno")
    }

}

func login3(params:[String: String], completion: (result:Bool) throws -> Void)
{
    //Request set up
    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as? NSDictionary
            if let parseJSON = json
            {
                let userID = parseJSON["user_id"] as? Int
                let loginError = parseJSON["user_not_found"] as? String
                let validationError = parseJSON["invalid_credentials"] as? String
                let exception = parseJSON["unable_to_access_login"] as? String

                var responseArray = [(parseJSON["user_id"] as? Int)]
                if userID != nil
                {
                    dispatch_async(dispatch_get_main_queue()) {
                        completion(result:true)
                    }

                }
                else if loginError != ""
                {
                    dispatch_async(dispatch_get_main_queue()){
                        completion(result: false)
                        self.loginErrorLabel.text = loginError
                        throw LoginError.User_Not_Found
                    }
                }
                else if validationError != ""
                {
                    dispatch_async(dispatch_get_main_queue()){
                        completion(result:false)
                        self.validationErrorLabel.text = validationError
                        throw LoginError.Invalid_Credentials
                    }

                }
                else if exception != nil
                {
                    dispatch_async(dispatch_get_main_queue()){
                        completion(result:false)
                        self.exceptionErrorLabel.text = "Unable to login"
                        throw LoginError.Unable_To_Access_Login
                    }
                }
            }
            else
            {
            }
        }
        catch let parseError {
            // Log the error thrown by `JSONObjectWithData`
        })

        task.resume()

}

您可以做的是将错误封装到可抛出的闭包中,如下面的代码所示,以实现您想要的:

func login3(params:[String: String], completion: (inner: () throws -> Bool) -> ()) {

   let task = session.dataTaskWithRequest(request, completionHandler: { data, response, error -> Void in

            let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves) as? NSDictionary

            if let parseJSON = json {
               let userID = parseJSON["user_id"] as? Int
               let loginError = parseJSON["user_not_found"] as? String
               let validationError = parseJSON["invalid_credentials"] as? String
               let exception = parseJSON["unable_to_access_login"] as? String

               var responseArray = [(parseJSON["user_id"] as? Int)]
               if userID != nil {
                 dispatch_async(dispatch_get_main_queue()) {
                     completion(inner: { return true })
                 }

            }
            else if loginError != ""
            {
                dispatch_async(dispatch_get_main_queue()) {
                    self.loginErrorLabel.text = loginError
                    completion(inner: { throw LoginError.User_Not_Found })
                }
            }
            else if validationError != ""
            {
                dispatch_async(dispatch_get_main_queue()) {
                    self.validationErrorLabel.text = validationError
                    completion(inner: {throw LoginError.Invalid_Credentials})
                }
            }
            else if exception != nil
            {
                dispatch_async(dispatch_get_main_queue()){
                    self.exceptionErrorLabel.text = "Unable to login"
                    completion(inner: {throw LoginError.Unable_To_Access_Login})
                }
            }
        }
        else
        {
        }
    }

   task.resume()
}

您可以通过以下方式调用它:

self.login3(dict) { (inner: () throws -> Bool) -> Void in
   do {
     let result = try inner()
     self.performSegueWithIdentifier("loginSegue", sender: nil)
   } catch let error {
      print(error)
   }
}

诀窍是login3函数需要一个额外的闭包,称为'inner'类型的() throws -> Bool。这个闭包要么提供计算结果,要么抛出异常。闭包本身是在计算过程中通过以下两种方式之一构建的:

  • 如果出现错误:inner: {throw error}
  • 如果成功:inner: {return result}

我强烈推荐您一篇关于使用的优秀文章try/catch在异步调用中在 Swift 中使用 try / catch 和异步闭包 http://appventure.me/2015/06/19/swift-try-catch-asynchronous-closures/

我希望这对你有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用完成处理程序进行抛出操作 的相关文章

  • 使用 FFT 执行音频分析

    我已经被这个问题困扰好几天了 并且浏览了几乎所有相关的 StackOverflow 页面 通过这次活动 我现在对 FFT 是什么及其工作原理有了更深入的了解 尽管如此 我在将其实现到我的应用程序中时遇到了极大的困难 简而言之 我想做的是为我
  • prepareForSegue 和 PerformSegueWithIdentifier 发送方

    我想知道标题中的函数如何工作以及发送者参数 假设单击按钮调用了performSegue方法 那么这是否也调用了prepareSegue方法 是否在performSegue方法之前但在按下按钮之后调用prepareSegue方法 另外 这两个
  • 解包可选值时意外发现 nil - 使用 ALAMOFIRE

    我正在尝试使用 Alamofire 获取 JSON 格式的数据 当我使用一个 URL 时 它工作正常 当我使用另一个 URL 时 我在解包可选值时收到错误 我似乎无法追踪错误来自哪里 我已采取将代码放入 ViewDidLoad 来跟踪错误
  • 如何快速从解析中加载图像?

    我想知道是否有人可以帮助我 我是应用程序开发的新手 我正在从我的应用程序上传图像以在解析文档的帮助下毫无问题地进行解析 let imageData UIImagePNGRepresentation scaledImage let image
  • Carthage 更新错误:“GitHub API 请求失败:凭据错误”

    这是我的购物车文件 Kanna HTML parsing library github tid kijyun Kanna gt 1 0 0 Realm database ORM github realm realm cocoa 当我跑步时c
  • 在 SwiftUI 中,如何执行手势但将手势转发到其后面的视图?

    我正在创建一个工具提示系统 如果用户触摸工具提示之外的任何地方 我想关闭工具提示 我希望这样在工具提示之外的触摸既可以消除工具提示 又可以激活用户点击的任何控件 因此 您可以打开一个工具提示 然后仍然单击工具提示外部的按钮 并在第一次点击时
  • 具有透明背景的 Swift 模态视图控制器 [重复]

    这个问题在这里已经有答案了 我知道这个话题很受欢迎 但我在编程语言中遇到了一些问题 事实是我仍然不明白我把代码放在哪里 好吧 我就来说说整个案子 我正在尝试制作一个与正常情况稍有不同的模态 Swift 通过单击按钮 ViewControll
  • ExpandableLabel iOS 中的“少看”

    我正在使用第三方库可扩展标签 https github com apploft ExpandableLabel实施一个see more特征 我正在寻找仅快速的解决方案 其中包含标签中的文本而不是按钮中的文本 因此这可以完美地工作 添加库并更
  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 在completionHandlers中存储值 - Swift

    我正在创建一个completionHandler它返回一个字典 但是当我在另一个类中调用这个方法时 它的值是零 func fetchLatestPosts completionHandler responseDict NSDictionar
  • skView.ignoreSiblingOrder 在 swift 中的重要性/效率?

    这样做有多重要 高效skView ignoreSiblingOrder true初始化场景时 现在 我将其设置为 true 但由于某种原因 当我从 MainMenu 场景启动 GameScene 时 它 会在我的角色之前加载背景 即使背景的
  • 在 Swift 中使用 commitEditingStyle 动态删除 UITable 部分

    我正在处理一个无法解决的问题 我有一个来自客户数据库数组的名称表 每个客户在其他数据成员中都有一个名称属性 我可以成功删除某个部分中的行 但我不能删除该部分 当该部分中的最后一行被删除时 该部分必须消失 I got NSInternalIn
  • 从 Firestore 获取值并使用异步将输出存储为全局

    我正在尝试获取 firestore 数据 然后将其存储在变量中 async function getchildContent Parent Message let count 0 var db firebase firestore var
  • 为什么“finally”中的 return 会覆盖“try”?

    try catch 块中的 return 语句如何工作 function example try return true finally return false 我期望这个函数的输出是true 但相反它是false Finally alw
  • SwiftUI - 预览时未知的预览提供程序“ContentView_Previews_”。发生在一个全新的项目中

    我有这个简单的观点 import SwiftUI struct ContentView View var body some View Text Hello struct ContentView Previews PreviewProvid
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • WCF - AsyncPattern=true 或 IsOneWay=true

    我的 WCF 服务中很少有方法需要花费大量时间 生成报告和发送电子邮件 根据目前的要求 要求客户端应用程序只需提交请求 然后不等待整个过程完成 它将允许用户继续在客户端应用程序中执行其他操作 而不是等待整个过程完成 我很困惑该走哪条路 As
  • 如何在 Swift 中创建 UIAlertView?

    我一直在努力在 Swift 中创建 UIAlertView 但由于某种原因我无法得到正确的语句 因为我收到此错误 找不到接受提供的 init 重载 论点 我是这样写的 let button2Alert UIAlertView UIAlert
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我

随机推荐

  • malloc(sizeof(int)) vs malloc(sizeof(int *)) vs (int *)malloc(sizeof(int))

    我承认这三个都有不同的含义 但是 我不明白这些都适用于哪些特定情况 任何人都可以分享每个例子吗 谢谢 malloc sizeof int malloc sizeof int int malloc sizeof int malloc size
  • 事务隔离级别和锁定记录,对正在运行的事务中的记录禁用 SELECT

    Can I disable SELECT在事务内部使用的行上 例如 表中的行potatoes在事务 1 中被销毁 并且需要很长时间才能销毁 在交易2中 有SELECT on the potatoes桌子 我不想选择事务 1 中正在使用的那些
  • 实体框架代码优先开发资源和文档

    我知道 EF4 仍在开发中 但作为该主题的新手 我需要使用 EF 4 代码优先方法的文档 教程等 所有信息都位于 EF 4 团队博客中 但分散在不同的帖子中 全面覆盖真的很好 有人知道有这样一个地方吗 迄今为止我见过的最好的在线资源是斯科特
  • 如何禁用按 Enter 键时的自动提交行为?

    我想根据我输入的输入文本按 Enter 键转到 p2 htm 或 p3 htm 我还想按 Submit1 按钮手动提醒 no1 它在 FireFox 中工作 但在 IE6 中 当我按 Enter 键时 它将提交提交按钮 我怎样才能在 IE
  • 使用 Google Cloud + CloudFlare 创建子域

    我在 CloudFlare 上有一个域名 bar com 该域名链接到 Google Cloud 上托管的网站 我可以在 CloudFlare 上为子域名 foo 创建新的 A 记录 但如何将其映射到 Google Cloud 上的 bar
  • 将 LinearSVC 的决策函数转换为概率(Scikit learn python)

    我使用 scikit learn LinearSVC 中的线性 SVM 来解决二元分类问题 我知道 LinearSVC 可以为我提供预测标签和决策分数 但我想要概率估计 对标签的置信度 由于速度原因 我想继续使用 LinearSVC 与具有
  • python - 获取当前模块中所有函数的列表。检查当前模块不起作用?

    我有以下代码 fset obj for name obj in inspect getmembers sys modules name if inspect isfunction obj def func num pass if name
  • 使用 d3-cloud 动态调整大小的词云

    我正在通过修改以下代码来创建词云 https github com jasondavies d3 cloud https github com jasondavies d3 cloud 我可以通过修改 w h 来更改大小 但我想随着浏览器窗
  • ModelState.AddModelError 到字段的特定 ValidationMessageFor?

    我有以下代码来生成 html 输入和验证消息 Html ValidationSummary false div class col md 10 Html TextBoxFor model gt model ImageUpload new t
  • 具有多个参数的 MapStruct QualifiedByName

    我遇到过一种情况 我的映射方法有 3 个参数 并且所有这三个参数都用于派生目标类型的属性之一 我在接口中创建了一个默认映射方法 保留了派生属性的逻辑 现在为了调用此方法 我可以使用expression java method call he
  • 内存泄漏是否正常? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否可以接受内存泄漏 http en wikipedia org wiki Memory leak在您的 C 或 C 应用程序中 如果您分配一些
  • evp_crypt 在 c 中的 for 循环中不起作用

    我是新来的 如果我做错了什么 请原谅 我尝试使用加密字符串创建一个数组 我使用 EVP API 进行加密 这工作正常 但是当我尝试在 foo 循环中使用加密函数时 控制台没有给我任何信息 这是我的加密函数 char encrypt char
  • 如何在 Python 中压缩字符串

    我正在制作一个 python 脚本 将字符串发送到 Web 服务 在 C 中 我需要压缩或压缩这个字符串 因为带宽和 MB 数据是有限的 是的 大写 因为它非常有限 我正在考虑将其转换为文件 然后压缩该文件 但我正在寻找一种直接压缩字符串的
  • 为什么 Backbone Collection fetch 不返回承诺

    下面的示例代码运行良好 Auth controller prototype isLogged function Check if the user is authenticated var getAuthStatus this auth m
  • IE10 中本地存储的访问被拒绝

    昨天我安装了 Windows 8 现在试图了解为什么我在访问本地存储时收到 访问被拒绝 消息 该页面与浏览器 http localhost 位于同一台 PC 上 我的感觉是IE 10中的一项安全设置是错误的 但我还没弄清楚是哪一项 触发错误
  • 将 html 附加到指令中的元素并创建一个与其交互的本地函数

    在我的 AngularJS 应用程序中 我到处都有不同的复杂输入 例如 某些输入具有使用 Google Places 自动完成功能或 Twitter Bootstrap 自动完成功能的指令 我正在寻找一种方法来制作一个指令 当我们添加一些文
  • 使用箭头键浏览 JButton

    我做了一个JButton数组 代表卡片 共有 16 张 4 4 我怎样才能在其中浏览JButton使用键盘上的箭头而不是鼠标 我如何 单击 JButton按 ENTER 键而不是单击鼠标 也许有另一种方法可以做到这一点而不是使用JButto
  • 将 root 中的默认 python 更改为 anaconda 的 python

    我已经在我的系统中安装了 python 2 7 并且还安装了 Anaconda 现在 我正在使用 python 的 anaconda 它运行得很好 不幸的是 我想使用anaconda的python来使用root运行 问题是我无法更改 roo
  • 仅允许接下来的 5 个工作日 jquery datepicker

    我有一个日期选择器 用于设置约会 唯一的问题是老板希望预约日期仅限于接下来的 5 个工作日 我知道如何禁用周末 但我有点不清楚如何做到这一点 以便如果我选择周三 它可以让我选择下周三之前的日期并考虑周末 有人对如何实现这一目标有任何想法吗
  • 无法使用完成处理程序进行抛出操作

    我正在尝试添加一个throws使用完成处理程序添加到我现有的函数 但我不断收到警告说no calls throwing functions occur within try expression 在我抛出错误的部分中 我收到一条错误消息 从