2016-12-16 3 views
5

Я пытаюсь преобразовать URLRequest в NSMutableURLRequest в Swift 3.0, но я не могу заставить его работать. Это код, у меня есть:Преобразование URLRequest в NSMutableURLRequest

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

Но это говорит

не может преобразовать тип URLRequest ввести NSMutableURLRequest.

Когда я пытаюсь использовать «как», он просто говорит, что приведение всегда будет терпеть неудачу. Что я делаю?

ответ

3

Основы этого: получить измененную копию, обновить измененную копию, а затем обновить запрос с помощью изменяемой копии.

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.

+0

Совершенными кажется литье его NSURLRequest затем получить изменяемую копию не выдаст ошибку, но я думал, что я попробовал это, и это не сработало , Наверное, я ошибся. Спасибо! – Minimi

+0

Создание нового (изменчивого) запроса и замена исходного запроса не будет работать при попытке установить свойство по запросу, которому вы не владеете. Например, в 'webView (_: shouldStartLoadWith: navigationType:)'. Любые предложения по этому сценарию? –

0

Поскольку iOS 10 SDK MutableURLRequest устарел в пользу использования URLRequest struct type с ключевым словом var. Также URLRequestis bridged к 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)!) 
+0

Плакат пытался вызвать URLProtocol.setProperty (true, forKey: "", in: request), который не примет объект URLRequest. –

Смежные вопросы