无法使用类型为“(NSMutableURLRequest,(_,_,_) throws -> _)”的参数列表调用“dataTaskWithRequest”

Posted

技术标签:

【中文标题】无法使用类型为“(NSMutableURLRequest,(_,_,_) throws -> _)”的参数列表调用“dataTaskWithRequest”【英文标题】:Cannot invoke 'dataTaskWithRequest' with an argument list of type '(NSMutableURLRequest, (_, _, _) throws -> _)' 【发布时间】:2015-06-09 16:59:46 【问题描述】:

在 Xcode 7 Beta 中开始使用 Swift 2 后,我收到错误 cannot invoke。这个问题是什么原因造成的?

我尝试通过以下两个问题找出我的问题,但我仍然收到错误:Question 1, Question 2

错误:

无法使用类型参数列表调用“dataTaskWithRequest” '(NSMutableURLRequest, (_, _, _) throws -> _)'

完整代码

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) data, response, error in
            let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as? NSDictionary

            if let parseJSON = json 
                let resultValue:String = parseJSON["status"] as! String

                if(resultValue=="Success")

                    //Store Confimed Account Detail Inside Core Data
                    try self.saveAccountDetail(userloginTextField!, confirmDataRetrieve: 0)

                    //Login is Successful
                    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isUserLoggedIn")
                    NSUserDefaults.standardUserDefaults().synchronize()

                    self.dismissViewControllerAnimated(true, completion: nil)

                
            

        

【问题讨论】:

【参考方案1】:

感谢 Leo Dabus,在他的帮助下,我发现这是 Swift 2 中的新功能。您输入代码的方式应该是 trytry! 处理

NSJSONSerialization 应该运行:(如果是抛出输入你删除!

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

【讨论】:

来自文档:有时您知道抛出函数或方法实际上不会在运行时抛出错误。在那些场合,你可以写试试!在表达式之前禁用错误传播并将调用包装在运行时断言中,即不会引发错误。如果实际抛出错误,您将收到运行时错误。【参考方案2】:

try 更改为try! 然后它将开始正常编译。

【讨论】:

【参考方案3】:

试试这样:

let task =  NSURLSession.sharedSession().dataTaskWithRequest(request,
    completionHandler: 
        (data, response, error) -> Void in
        if let data = data 
            println(data.length)
            // you can use data here
         else if let error = error 
            println(error.description)
        
)
task!.resume()

你可以用这个来测试

let task =  NSURLSession.sharedSession().dataTaskWithRequest(
    NSURLRequest(URL: NSURL(string: "https://cdn.photographylife.com/wp-content/uploads/2014/06/Nikon-D810-Image-Sample-6.jpg")!),
    completionHandler: 
        (data, response, error) -> Void in
        if let data = data 
            println(data.length)
            if let image = UIImage(data: data) 
                println(image.description)
            

         else if let error = error 
            println(error.description)
        

)
task!.resume()

【讨论】:

现在我收到错误Extra argument "completionHandler" in call 现在我收到此错误Invalid conversion from throwing function of type '(_, _, _) throws -> Void' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void' 一切正常,直到我转换它。如何再次运行转换? 让我们continue this discussion in chat。 我已经下载了 beta 7 但我还没有打开它。我将尝试打开一个示例项目并为您修复语法

以上是关于无法使用类型为“(NSMutableURLRequest,(_,_,_) throws -> _)”的参数列表调用“dataTaskWithRequest”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用类型为“()”的参数列表为类型“Int”调用初始化程序

无法使用类型为“”的参数列表调用类型“”的初始化程序

无法使用类型为 '(Codable.Type?

Constraint 无法解析为类型

无法使用类型为“(UInt32)”的参数列表调用类型“CGBitmapInfo”的初始化程序

无法使用“Any?”类型的索引为“[AnyHashable:Any]”类型的值下标