Alamofire:无法使用“(方法,NSURL)”类型的参数列表调用“URLRequest”
Posted
技术标签:
【中文标题】Alamofire:无法使用“(方法,NSURL)”类型的参数列表调用“URLRequest”【英文标题】:Alamofire: Cannot invoke 'URLRequest' with an argument list of type '(Method, NSURL)' 【发布时间】:2015-06-20 02:01:52 【问题描述】:我正在使用请求路由器模式,看起来像这样:
enum Router: URLRequestConvertible
static let baseURLString = "https://somewhere"
case DoSomething
var URLRequest: NSURLRequest
let (method: Method, path: String, parameters: [String: AnyObject]) =
switch self
case .DoSomething:
var params = [String: AnyObject]()
return (.GET, "/doSomething", params)
()
let URL = NSURL(string: Router.baseURLString)!.URLByAppendingPathComponent(path)
let request = URLRequest(method, URL) // <- ERROR HERE
let encoding = ParameterEncoding.URL
return encoding.encode(request, parameters: parameters).0
我得到了前面提到的“不能使用类型为 '(Method, NSURL)' 的参数列表调用 'URLRequest'”
查看 URLRequest 的方法签名我看到了:
func URLRequest(method: Method, URL: URLStringConvertible) -> NSURLRequest
NSURL
符合URLStringConvertible
协议,所以一切都应该很好。但事实并非如此。现在,这是奇怪的部分:
如果我将 URLRequest 剪切并粘贴到与我的枚举相同的文件中,通过将其命名为 URLRequestt 来调整其名称(以避免与原始文件冲突),然后改用该函数,那么所有编译器错误都会消失。
我已将 Alamofire swift 文件复制到我的项目中,因为我的目标是 ios 7,所以这也可能是一个因素。我没有使用嵌入式框架。
所以,我的问题是:为什么这段代码会引发编译器错误,为什么简单地复制/粘贴/重命名 URLRequest 函数会导致它工作?
【问题讨论】:
【参考方案1】:如果您在项目中使用 Alamofire 作为框架,您将无法看到 URLRequest
函数,因为它不是 public
。您可以将其公开(我不会因为一些琐碎的事情而分叉 AFNetworking),或者您可以在您的模块中实现此函数的副本。
不过,我在我的项目中使用 Alamofire 源进行了实验,我看到了与您描述的相同的奇怪行为。但是您可以通过在源文件中包含此函数的副本(如您所述)或完全绕过它来轻松绕过它:
let request = NSMutableURLRequest(URL: URL)
request.HTTPMethod = method.rawValue
【讨论】:
你说得对,它不公开。但它的默认值将是“内部”。因为我已将 Alamofire .swift 文件复制到我的项目中(而不是作为嵌入式框架),所以这不会使它成为我的项目的“内部”,因此我的所有 Swift 代码都可以访问它吗? 我已经做了一些进一步的调查,如果我将 URLRequest() 重命名为 xURLRequest() 在 Alamofire.swift 中,然后调用该函数......没问题。如果我在 Alamofire.swift 中放置另一个随机命名的函数,那么使用它也没有问题。 URLRequest 有可能有什么特别之处吗?我该如何检查? 啊哈。 URLRequest 有一些特别之处,我刚刚在我的枚举中将它声明为一个符号。这可能优先于 Alamofire.swift 中的符号。我需要它符合URLRequestConvertible
协议。我愿意放弃并声明一个具有不同名称的新函数,但如果有一个“正确”的方法来解决这个问题,我想找到它。以上是关于Alamofire:无法使用“(方法,NSURL)”类型的参数列表调用“URLRequest”的主要内容,如果未能解决你的问题,请参考以下文章