将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
remoteUrl
是nil
,我不知道这里有什么问题。
之后,我尝试像这样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.latitude),\(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.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)
正如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。