2015-02-14 4 views
30

Ich versuche, eine String-NSURL und mein Code für das zu konvertieren ist Unten:Convert String zu NSURL ist return null in schnellen

var url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=\(self.latitude),\(self.longitude)&destinations=\(self.stringForDistance)&language=en-US" 
    println("This is String: \(url)") 
    var remoteUrl : NSURL? = NSURL(string: url) 
    println("This is URL: \(remoteUrl)") 

Und Konsole druckt etwas wie folgt aus:

This is String: https://maps.googleapis.com/maps/api/distancematrix/json?origins=-34.4232722,150.8865837&destinations=-34.4250728,150.89314939999997|-34.4356434,150.8858692|-34.4250728,150.89314939999997|-34.4356434,150.8858692|-34.4250728,150.89314939999997|-34.4356434,150.8858692|-34.423234,150.88658899999996|-34.423234,150.88658899999996|-34.428251,150.899673|-34.4257439,150.89870229999997|-34.423234,150.88658899999996|-34.4257439,150.89870229999997|-34.425376,150.89388299999996&language=en-US 

This is URL: nil 

Die remoteUrl ist nil und ich weiß nicht, was das Problem hier ist.

Danach versuche ich sort String wie folgt aus:

var url : String = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=-34.4232722,150.8865837&destinations=-34.4250728,150.89314939999997&language=en-US" 
    println("This is String: \(url)") 
    var remoteUrl : NSURL? = NSURL(string: url) 
    println("This is URL: \(remoteUrl)") 

Und Konsole druckt:

This is String: https://maps.googleapis.com/maps/api/distancematrix/json?origins=-34.4232722,150.8865837&destinations=-34.4250728,150.89314939999997&language=en-US 
This is URL: Optional(https://maps.googleapis.com/maps/api/distancematrix/json?origins=-34.4232722,150.8865837&destinations=-34.4250728,150.89314939999997&language=en-US) 

Dies funktioniert gut.

Also kann mir bitte jemand sagen, was ist los mit meinem ersten Fall?

+0

Haben Sie versucht, die Zeichen für den Einsatz in Urls zu entkommen? – dasdom

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/3040632/how-to-make-an-nsurl-that-contains-a-pipe-character. –

+0

ja es funktioniert dank ... Martin R –

Antwort

56

Wie von dem Martin R vorgeschlagen, sehe ich THIS Post und ich umgewandelt habe, dass Objective-C-Code zu schnell und ich diesen Code:

var url : NSString = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=\(self.latitud‌​e),\(self.longitude)&destinations=\(self.stringForDistance)&language=en-US" 
var urlStr : NSString = url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
var searchURL : NSURL = NSURL(string: urlStr)! 
println(searchURL) 

und diese ordnungsgemäß funktioniert.

Für swift 3.0:

let url : NSString = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=\(self.latitud‌​e),\(self.longitude)&destinations=\(self.stringForDistance)&language=en-US" 
let urlStr : NSString = url.addingPercentEscapes(using: String.Encoding.utf8.rawValue)! as NSString 
let searchURL : NSURL = NSURL(string: urlStr as String)! 
print(searchURL) 
+9

'urlStr = url.stringByAddingPercentEncodingWithAllowedCharacters lassen (.URLQueryAllowedCharacterSet())' –

+2

lassen urlStr = url.stringByAddingPercentEncodingWithAllowedCharacters (NSCharacterSet.URLQueryAllowedCharacterSet()) –

+1

dies ein Problem behoben, das ich mit begann zu sehen Swift 3. Ich bin mir nicht sicher, warum mein 'urlStr' in Swift 2.2 durchkommen konnte, aber' .addingPercentEncoding ... 'wurde behoben. – blwinters

1

Ich denke, versuchen, dies es perfekt ist für mich arbeiten

var url : String = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=-34.4232722,150.8865837&destinations=-34.4250728,150.89314939999997&language=en-US" 
     println("This is String: \(url)") 
     var urlStr : NSString = url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
     var remoteUrl : NSURL? = NSURL(string: url) 
     println("This is URL: \(remoteUrl!)") 
1

Sie können folgende Fehlermeldung erhalten, wenn NSURL null ist und versucht, Last http URL über Web-Ansicht:

fatal error: unexpectedly found nil while unwrapping an Optional value 

Um sicher zu sein, sollten wir verwenden:

var urlStr = strLink!.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 

if var url = NSURL(string: urlStr!){ 
    println(self.strLink!) 

    self.webView!.loadRequest(NSURLRequest(URL: url)) 

} 
+0

Dies ist nicht sicher. Die erste Zeile stürzt ab, wenn der optionale Wert für strLink gleich Null ist. Genau wie self.webView. – brodney

+0

Erwartet, dass Strlink nicht NULL ist, und wenn nicht sicher, müssen Bedingung dafür platzieren. – Arvind

18

als blwinters sagte in Swift 3.0 Verwendung

URL(string: urlPath.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!) 
0

SWIFT 3.0

Ein sicherer Weg, um eine schlechte Saite beheben zu NSURL ist umgewandelt wird durch das URLPath String-Variable Abwickeln mit „guard Lassen Sie "

guard let url = NSURL(string: urlPath.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!) 
      else 
      { 
       print("Couldn't parse myURL = \(urlPath)") 
       return 
      } 

Die Variable namens" urlPath "in meinem obigen Beispiel wäre die URL-Zeichenfolge, die Sie haben bereits an anderer Stelle in Ihrem Code deklariert.

Ich stieß auf diese Antwort, weil ich zufällig den Null-Fehler mit XCode breaking an dem Punkt bekam, an dem meine Zeichenfolge zu einem NSURL gemacht wurde. Keine Logik, warum es zufällig war, selbst wenn ich die URLs ausgedruckt habe, würden sie gut aussehen. Sobald ich die .AddingPercentEncoding-Funktion hinzugefügt hatte, funktionierte es ohne Probleme wieder.

tl; dr Für alle, die dies lesen, versuchen Sie meinen obigen Code und tauschen Sie "urlPath" für Ihre eigene lokale String-URL aus.

+0

Beachten Sie, dass dies nur innerhalb von Funktionen/Schließungen verwendet werden kann –

0

diese Arbeit für mich

let url : NSString = MyUrls.baseUrl + self.url_file_open as NSString 
let urlStr : NSString = url.addingPercentEscapes(using: String.Encoding.utf8.rawValue)! as NSString 
if let url = URL(string: urlStr as String) { 
    let request = URLRequest(url: url) 
    self.businessPlanView.loadRequest(request) 
}