将URLRequest转换为NSMutableURLRequest

13

我正在尝试在Swift 3.0中将URLRequest转换为NSMutableURLRequest,但是我无法使其正常工作。这是我所拥有的代码:

var request = self.request
URLProtocol.setProperty(true, forKey: "", in: request)

但是它说

无法将类型为URLRequest的对象转换为类型为NSMutableURLRequest的对象。

当我尝试使用“as”进行强制转换时,它只会提示转换总是失败。我该怎么办?

4个回答

14

基本思路是获取可变的副本,更新可变的副本,然后使用可变的副本更新请求。

let mutableRequest = ((self.request as NSURLRequest).mutableCopy() as? NSMutableURLRequest)!
URLProtocol.setProperty(true, forKey: "", in: mutableRequest)
self.request = mutableRequest as URLRequest

最好避免使用强制解包。

guard let mutableRequest = (self.request as NSURLRequest).mutableCopy() as? NSMutableURLRequest else {
    // Handle the error
    return
}

URLProtocol.setProperty(true, forKey: "", in: mutableRequest)
self.request = mutableRequest as URLRequest
注意:self.request 必须声明为var而不是let

看起来完美,将其转换为NSURLRequest然后获取可变副本不会抛出错误,但我认为我已经尝试过这个方法,但它没有起作用。我想我错了。谢谢! - Minimi
1
当尝试在您不拥有的请求上设置属性时,创建一个新的(可变)请求并替换原始请求是行不通的。例如,在webView(_:shouldStartLoadWith:navigationType:)中。针对这种情况有什么建议吗? - Steve Madsen

4

自从iOS 10 SDK以后,MutableURLRequest已经被弃用,建议使用var关键字的URLRequest结构体类型。同时,URLRequest被桥接NSMutableURLRequest,因此可以安全地进行强制转换:

let  r = URLRequest(url: URL(string: "https://stackoverflow.com")!) as! NSMutableURLRequest
URLProtocol.setProperty("Hello, world!", forKey: "test", in: r)
print(URLProtocol.property(forKey: "test", in: r as! URLRequest)!)

这个很好用,但是当我在另一个方法中调用URLProtocol.property(forKey: "test", in: request)当请求被发送回给我时,它总是返回nil - Doug McBride

2

使用Swift 4.1,以下解决方案适用于我

if let mutableRequest = (request as NSURLRequest).mutableCopy() as? NSMutableURLRequest {
    mutableRequest.addValue("VALUE", forHTTPHeaderField: "KEY")
    print(mutableRequest)
}

0

work in swift 5

guard let mutableRequest = (self.request as NSURLRequest).mutableCopy() as? NSMutableURLRequest else {
            // Handle the error
            return
        }
URLProtocol.setProperty(true, forKey: "protocolKey", in: mutableRequest)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接