Преобразование строки в NSURL возвращает nil в swift

Я пытаюсь преобразовать String до NSURL и мой код ниже:

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

и консоль выводит что-то вроде этого:

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

на remoteUrl is nil и я не знаю, в чем здесь проблема.

после этого я пытаюсь сортировать String такой:

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

и консольные отпечатки:

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)

это работает нормально.

так может кто-нибудь пожалуйста, скажите мне, что случилось с моим первым кейс?

6 ответов


как предложил Мартин R, я вижу этой post и я преобразовал этот код objective-c в swift, и я получил этот код:

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)

и это правильно.

для 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)

Как сказал blwinters, в Swift 3.0 использовать

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

Я думаю, попробуйте это, это отлично работает для меня

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

Вы можете получить следующую ошибку, если NSURL равен null и пытается загрузить HTTP URL через веб-представление:

fatal error: unexpectedly found nil while unwrapping an Optional value

для безопасности мы должны использовать:

 var urlStr = strLink!.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

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

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

}

SWIFT 3.0

безопасный способ исправить плохую строку, преобразуемую в NSURL, - это развернуть строковую переменную urlPath с помощью "guard let"

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

переменная под названием "urlPath" в моем примере выше будет строкой url, которую вы уже объявили где-то еще в своем коде.

я наткнулся на этот ответ, потому что случайно я получал нулевую ошибку с Xcode breaking в точке, когда моя строка была сделана в NSURL. Никакой логики, почему это было случайный, даже когда я напечатал url-адрес, они будут выглядеть нормально. Как только я добавил .addingPercentEncoding он вернулся к работе без каких-либо проблем.

tl; dr для тех, кто читает это, попробуйте мой приведенный выше код и замените "urlPath" на свой собственный локальный строковый url.


эта работа для меня

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