web-dev-qa-db-fra.com

Convertir une chaîne en NSURL est un retour nul en swift

J'essaie de convertir une String en NSURL et mon code est le suivant:

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)")

Et la console affiche quelque chose comme ça:

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

La remoteUrl est nil et je ne sais pas quel est le problème ici.

Après cela, j'essaie de trier String comme ceci:

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)")

Et la console imprime:

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)

Cela fonctionne bien.

Alors, quelqu'un peut-il me dire ce qui ne va pas avec mon premier cas?

36
Dharmesh Kheni

Comme suggéré par le Martin R, je vois THIS post et j'ai converti ce code objective-c en Swift et j'ai obtenu ce 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)

et cela fonctionne correctement.

Pour 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)
69
Dharmesh

comme dit blwinters, dans Swift 3.0 use

URL(string: urlPath.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
34
djdance

Je pense que ça fonctionne parfaitement pour moi 

  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
Ilesh

Vous pouvez obtenir l'erreur suivante si NSURL est null et que vous essayez de charger l'URL http sur l'affichage Web:

fatal error: unexpectedly found nil while unwrapping an Optional value

Pour être en sécurité, nous devrions utiliser:

 var urlStr = strLink!.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

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

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

}
1
Arvind

Swift 3.0

Un moyen sûr de réparer une chaîne incorrecte en cours de conversion en NSURL consiste à décompresser la variable de chaîne urlPath à l'aide de "guard let"

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

La variable appelée "urlPath" dans mon exemple ci-dessus serait la chaîne d'URL que vous avez déjà déclarée ailleurs dans votre code. 

Je suis tombé sur cette réponse parce que, de manière aléatoire, j'avais l'erreur nulle avec XCode qui se cassait au moment où ma chaîne avait été transformée en NSURL. Aucune logique quant à la raison pour laquelle il était aléatoire même lorsque j'ai imprimé l'URL, ils auraient l'air bien. Dès que j'ai ajouté le .addingPercentEncoding, il était de nouveau opérationnel sans aucun problème. 

tl; dr Pour tous ceux qui lisent ceci, essayez le code ci-dessus et remplacez "urlPath" par votre propre URL de chaîne locale.

0

ce travail pour moi 

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)
}
0
Lizzeth Zaragoza