【问题标题】:Cannot convert value of type to expected argument type NSURLSessionDelegate无法将类型的值转换为预期的参数类型 NSURLSessionDelegate
【发布时间】:2016-06-03 05:21:20
【问题描述】:

我知道这应该很简单,但我是 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

我做错了什么?

【问题讨论】:

    标签: ios swift types


    【解决方案1】:

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

    public class API : NSObject, NSURLSessionDelegate

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

    将代理分配给 URL 会话时,分配的对象必须是 API 的实例。 有两种方法可以解决这个问题:

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

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

    【讨论】:

    • 如果我使用第一个选项,当我调用函数时,我不能将参数传递给这个函数,因为调用应该是这样的:API.sendHttpRequestNew(self : API)
    • 你需要通过let api = API()之类的操作创建一个API对象,然后调用api对象上的方法:api.sendHttpRequestNew(...)
    猜你喜欢
    • 2016-07-27
    • 2016-07-02
    • 2016-03-21
    • 1970-01-01
    • 2020-03-01
    • 2016-08-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多