将string转换为NSURL在swift中返回nil

我想转换一个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 

remoteUrlnil ,我不知道这里有什么问题。

之后,我尝试像这样sortingString

 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) 

这工作正常。

那么有谁能告诉我我的第一个案子有什么问题?

正如Martin R所build议的那样,我看到了这篇文章,并且把这个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为空,并尝试通过Web视图加载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的坏string的安全方法是使用“guard let”解开urlPathstringvariables,

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

在我上面的例子中,名为“urlPath”的variables就是你已经在你的代码中另外声明的urlstring。

我碰到这个答案,因为随机我得到了零的错误与XCode中断我的string被制成一个NSURL的点。 没有逻辑,为什么它是随机的,即使当我打印的url,他们会看起来不错。 一旦我添加了.addingPercentEncoding,它就回来了,没有任何问题。

tl; dr对于任何人阅读这个,试试我的上面的代码,并换出“urlPath”为您自己的本地stringurl。