ios - 无法将类型的值转换为预期的参数类型 NSURLSessionDelegate

标签 ios swift types

我知道它应该很简单,但我是 Swift 的新手,看不出这里有什么问题:

public class API : NSObject, NSURLSessionDelegate{

    public class func sendHttpRequestNew(urlPath: String, params: AnyObject, method: String)-> Int {
        var delegate = self
        let txtUserName = "admin"
        let txtPassword = "test1234"
        let PasswordString = "\(txtUserName):\(txtPassword)"
        let PasswordData = PasswordString.dataUsingEncoding(NSUTF8StringEncoding)
        let base64EncodedCredential = PasswordData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
        let url: NSURL = NSURL(string: urlPath)!

        let request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
        request.setValue("Basic \(base64EncodedCredential)", forHTTPHeaderField: "Authorization")
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.HTTPMethod = method
        if method == "POST" || method == "PUT" {
            request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(params, options: [])
        }
        let config = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("unique")
        let authString = "Basic \(base64EncodedCredential)"
        config.HTTPAdditionalHeaders = ["Authorization" : authString]
        let session = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)

        let downloadTask = session.downloadTaskWithRequest(request)
        downloadTask.resume()
    }
}

我在 self 这一行遇到错误: let session = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)

无法将“API.type”类型的值转换为预期的参数类型 NSURLSessionDelegate

我做错了什么?

最佳答案

这里的问题是方法是用 class 声明的,使其成为 type method .当您在此方法中引用 self 时,您指的是类 API 本身,因此是错误。

公共(public)类 API:NSObject、NSURLSessionDelegate

声明API是NSObject的子类,符合NSURLSessionDelegate。

将委托(delegate)分配给 URL session 时,分配的对象必须是 API 的实例。 有两种方法可以解决这个问题:

  1. 通过去掉 class 前缀使 sendHttpRequest() 成为一个普通方法,或者,
  2. 使用 let session = NSURLSession(configuration: config, delegate: API(), delegateQueue: nil) 创建 session ,创建 API 实例并将其作为委托(delegate)传递。

在我看来,第一种选择更好。这样你就可以在其他地方保留一个 API 的实例,并像那样对它进行网络调用。

关于ios - 无法将类型的值转换为预期的参数类型 NSURLSessionDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35542524/

相关文章:

ios - iOS 中如何重置动画?

swift - 使用核心图使用自定义标签绘制散点图

swift - 如何将 ViewController 添加到 UITabBarController 并以编程方式加载它?

C long unsigned int 的简写形式是什么

ios - 回到屏幕时,导致我的应用崩溃的原因是什么?

javascript - 登录弹出窗口在 Facebook 应用程序中不起作用,如果存在弹出窗口阻止程序

ios - SpriteKit 中的 ScrollView

ios - 在 UIPageView 最后一页上滑动 Segue

javascript - 我很困惑名称是什么数据类型?函数数据类型或 boolean 数据类型,因为它会返回 boolean 值?

syntax - 如何定义类型 “function”的变量? (使用可选输入)