Преобразование String в 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
- 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)
Это нормально работает.
Так может кто-нибудь, пожалуйста, скажите мне, что не так с моим первым случаем?
Ответы
Ответ 1
Как предложил Мартин Р, я вижу ЭТО сообщение, и я преобразовал этот код objective-c в swift, и я получил этот код:
var url : NSString = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=\(self.latitude),\(self.longitude)&destinations=\(self.stringForDistance)&language=en-US"
var urlStr : NSString = url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
var searchURL : NSURL = NSURL(string: urlStr)!
println(searchURL)
и это работает правильно.
Для быстрого 3.0:
let url : NSString = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=\(self.latitude),\(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)
Ответ 2
как сказали blwinters, в Swift 3.0 используйте
URL(string: urlPath.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
Ответ 3
Я думаю, попробуй, это отлично работает для меня.
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!)")
Ответ 4
Вы можете получить следующую ошибку, если NSURL имеет значение null и пытается загрузить URL-адрес HTTP через веб-представление:
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))
}
Ответ 5
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, которую вы уже объявили где-то еще в своем коде.
Я наткнулся на этот ответ, потому что случайным образом я получал ошибку nil с разрывом XCode в точке, когда моя строка была сделана в NSURL. Никакой логики относительно того, почему это было случайным, даже когда я напечатал URL, они выглядели бы хорошо. Как только я добавил .addingPercentEncoding, он снова работал без каких-либо проблем.
tl; dr Для всех, кто это читает, попробуйте мой код выше и замените "urlPath" на свой собственный локальный строковый url.