【问题标题】:Invalid conversion from throwing function of type类型的抛出函数的无效转换
【发布时间】:2015-06-25 11:08:36
【问题描述】:

我正在尝试将我的代码转换为 Swift 2,但我遇到了最后一个函数的问题。我在task 的声明中收到以下错误:

Invalid conversion from throwing function of type ... to non throwing type.

    func performSearch(searchTerm: String){
    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithURL(urlForQuery(searchTerm)!, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
        do {
        let result: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSDictionary
        }
        let results: AnyObject? = result.objectForKey("results")

        if let testVar: NSMutableArray = results as? NSMutableArray {
                // Uncomment this to print all feeds
                 //println(testVar)
                self.searchedPodcasts.removeAllObjects()
                self.searchedPodcasts.addObjectsFromArray(testVar as [AnyObject])
                NSNotificationCenter.defaultCenter().postNotificationName("SearchPerformed", object: self)
        }

        })

        task!.resume()     
}

我尝试了以下方法,但它也不起作用,这也意味着由于某种原因我无法调用 task.resume:

    func performSearch(searchTerm: String){
    let session = NSURLSession.sharedSession()
     do {   
    let task = session.dataTaskWithURL(urlForQuery(searchTerm)!, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
        do {
        let result: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSDictionary
        }
        let results: AnyObject? = result.objectForKey("results")

        if let testVar: NSMutableArray = results as? NSMutableArray {
                // Uncomment this to print all feeds
                 //println(testVar)
                self.searchedPodcasts.removeAllObjects()
                self.searchedPodcasts.addObjectsFromArray(testVar as [AnyObject])
                NSNotificationCenter.defaultCenter().postNotificationName("SearchPerformed", object: self)
        }

        })
    } catch {
          print("error)
    }
        task!.resume()     
}

我能做些什么来解决它?

编辑:试过了,但仍然返回相同的错误。

     func test(searchTerm: String) {
    let session = NSURLSession.sharedSession()
    do {
        let task = try session.dataTaskWithURL(urlForQuery(searchTerm)!, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
             let result: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSDictionary
        })
    } catch  {
            print("hello")
        }
    }

【问题讨论】:

    标签: swift swift2


    【解决方案1】:

    尝试在do-try-catch 语句中添加一个 catch 块:

    do {
        let result: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSDictionary
    }
    catch {
        print("error");
    }
    

    您还需要在外部声明 result 变量或在 do 块内移动更多代码。

    有关 Swift 2 中的异常处理的更多信息check out this guide

    【讨论】:

    • 感谢您的帮助。还是不行,我已经更新了正题。
    • 现在您在完成处理程序中有一个try,您必须将try 包围在一个do-catch 块内。
    【解决方案2】:

    Apple 在 Swift 2 中将 NSError 替换为 ErrorType。

    因此,用 ErrorType 替换您自己对 NSError 的显式使用,您不需要其他答案中建议的额外 try catch 块,您可以用更少的代码来表达您的错误处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多