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) -&gt; 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”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Alamofire 测试存根响应

我无法使用 Alamofire 提出样品请求

无法使用 alamofire 4 上传带参数的图像?

似乎无法使用 Alamofire 获取缓存的响应

无法使用我在 Alamofire 完成块中分配的值

Alamofire 无法使用 php 获取请求