无法使用类型的参数列表调用“dataTask”(使用:NSMutableRequest,...)
Posted
技术标签:
【中文标题】无法使用类型的参数列表调用“dataTask”(使用:NSMutableRequest,...)【英文标题】:Cannot invoke 'dataTask' with an argument list of type (with: NSMutableRequest, ...) 【发布时间】:2017-08-28 06:55:50 【问题描述】:func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void)
let request = NSMutableURLRequest(url: targetURL)
request.httpMethod = "GET"
let sessionConfiguration = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfiguration)
let task = session.dataTask(with: request, completionHandler: (data: Data?, response: URLResponse?, error: NSError?) -> Void in
DispatchQueue.main.async(execute: () -> Void in
completion(data, (response as! HTTPURLResponse).statusCode, error)
)
)
task.resume()
在这里,我正在尝试 appCoda 的演示以集成 YouTube API。但由于此方法错误无法进一步移动:
无法使用类型为“(使用:NSMutableURLRequest,completionHandler:(Data?, URLResponse..)”的参数列表调用“dataTask”
【问题讨论】:
是的,我已经编辑了我的问题。谢谢。 你的问题不清楚,你想完成什么,遇到了什么错误?请参阅How to ask a good question 部分。let request = NSMutableURLRequest(url: targetURL)
使用URLRequest
而不是NSMutableURLRequest
。
对不起,我是 swift 新手。不知道要问什么。如果你能帮忙,请。
NSStuff:旧的 Objective-C 之一。首选 Swift 类型(只要有一个以 NS 为前缀的类,请检查是否没有 Swift 等效项,也没有“Mutable”)。 dataTask
不知道 (with:
的第一个参数属于 NSMutableURLRequest 类的方法,这就是编译器对你大喊大叫的原因。
【参考方案1】:
你可以使用 URLRequest 代替 NSMutableURLRequest:
public func getData(withApiEndpoint apiURL: String, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void)
var request = URLRequest(url: URL(string: apiURL)!)
for (key, value) in self.getDefaultHeaders()
request.setValue(value, forHTTPHeaderField: key)
request.httpMethod = String.kGet
if self.networkSession == nil
self.networkSession = URLSession(configuration: getSharedConfiguration(self.isIncognito))
self.networkDataTask = self.networkSession?.dataTask(with: request as URLRequest) (data, response, error) in
if error != nil
debugPrint(error!.localizedDescription)
completionHandler(data, response, error)
self.networkDataTask?.resume()
【讨论】:
【参考方案2】:试试这个 -
func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void)
var request = URLRequest(url: targetURL)
request.httpMethod = "GET"
let sessionConfiguration = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfiguration)
let task = session.dataTask(with: request) (data, response, error) in
DispatchQueue.main.async(execute: () -> Void in
completion(data, (response as! HTTPURLResponse).statusCode, error)
)
task.resume()
【讨论】:
【参考方案3】:使用 URLRequest 代替 NSMutableURLRequest
func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void)
var request = URLRequest(url: targetURL)
request.httpMethod = "GET"
let sessionConfiguration = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfiguration)
let task = session.dataTask(with: request, completionHandler: (data: Data?, response: URLResponse?, error: NSError?) -> Void in
DispatchQueue.main.async(execute: () -> Void in
completion(data, (response as! HTTPURLResponse).statusCode, error)
)
as! (Data?, URLResponse?, Error?) -> Void)
task.resume()
【讨论】:
您好,上面的 cmets 中已经定义了。谢谢你的回答。 这导致最后一行的 EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP,subcode=0x0) 为! (Data?, URLResponse?, Error?) -> Void) 一分钟我会帮你检查以上是关于无法使用类型的参数列表调用“dataTask”(使用:NSMutableRequest,...)的主要内容,如果未能解决你的问题,请参考以下文章
无法使用类型为“()”的参数列表为类型“Int”调用初始化程序