2016-12-16 11 views
5

Próbuję przekonwertować URLRequest na NSMutableURLRequest w Swift 3.0, ale nie mogę go uruchomić. Jest to kod mam:Konwertuj URLRequest do NSMutableURLRequest

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

ale mówi

nie można przekonwertować typu URLRequest wpisać NSMutableURLRequest.

Kiedy próbuję rzucać używając "jako", to po prostu mówi, że obsada zawsze zawodzi. Co ja robię?

Odpowiedz

3

Podstawą tego jest otrzymanie modyfikowalnej kopii, aktualizacja zmultipulowanej kopii, a następnie aktualizacja żądania za pomocą modyfikowalnej kopii.

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

Byłoby lepiej użyć uniknięcia wymuszonego rozwijania.

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 

Uwaga: self.request muszą być zadeklarowane var nie let.

+0

Idealny wydaje rzucając go NSURLRequest potem coraz zmienny kopii nie wygeneruje błąd, ale myślałem, że próbowałem i nie działa . Chyba się myliłem. Dziękuję Ci! – Minimi

+0

Tworzenie nowego (zmiennego) żądania i zastępowanie pierwotnego żądania nie będzie działało podczas próby ustawienia właściwości na żądanie, które nie jest Twoją własnością. Na przykład w 'webView (_: shouldStartLoadWith: navigationType:)'. Wszelkie sugestie dotyczące tego scenariusza? –

0

Ponieważ iOS 10 SDK MutableURLRequest jest przestarzały na rzecz używania typu struktury URLRequest z parametrem var. Również URLRequestis bridged do NSMutableURLRequest więc można bezpiecznie sprawiają wymuszone odlewy:

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

Plakat próbował wywołać URLProtocol.setProperty (true, forKey: "", in: request), który nie zaakceptuje obiektu URLRequest. –