Convert String to NSURL is return nil in swift

Posted

技术标签:

【中文标题】Convert String to NSURL is return nil in swift【英文标题】: 【发布时间】:2015-04-15 09:09:40 【问题描述】:

我正在尝试将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,我不知道这里有什么问题。

之后我尝试像这样对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)

这工作正常。

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

【问题讨论】:

您是否尝试转义字符以在 url 中使用? 看看***.com/questions/3040632/…。 是的,它正在工作,谢谢...Martin R 【参考方案1】:

按照 Martin R 的建议,我看到了 THIS 帖子,然后我将 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)

【讨论】:

let urlStr = url.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet()) 让 urlStr = url.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) 这解决了我开始在 Swift 3 中看到的一个问题。不知道为什么我的 urlStr 能够在 Swift 2.2 中通过,但添加 .addingPercentEncoding... 修复了它。 一个建议是安全地打开 url,以防万一它有垃圾数据或 nil。使用“guard let”或“if let”语法来做到这一点。查看我的答案以获取更多信息 以上ObjC中的解决方案[url stringByAddingPercentEncodingWithAllowedCharacters:NSCharact‌​erSet.URLQueryAllowe‌​dCharacterSet];【参考方案2】:

我觉得试试这个对我来说非常有用

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

【讨论】:

【参考方案3】:

如果 NSURL 为 null 并尝试通过 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))


【讨论】:

这不安全。如果可选的 strLink 为 nil,第一行将崩溃。和 self.webView 一样。 期望 strlink 不为 null 以及如果不确定是否需要为此设置条件。【参考方案4】:

正如 blwinters 所说,在 Swift 3.0 中使用

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

【讨论】:

谢谢你!这有助于我通过 URL 传递 sd_setImage 字符串。有效。 :)【参考方案5】:

SWIFT 3.0

修复转换为 NSURL 的错误字符串的安全方法是使用“guard let”解开 urlPath 字符串变量

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

上面示例中名为“urlPath”的变量将是您已经在代码中的其他位置声明的 url 字符串。

我遇到了这个答案,因为在我的字符串被制作成 NSURL 时,我随机收到了 XCode 中断的 nil 错误。没有逻辑为什么它是随机的,即使我打印了网址,它们看起来也很好。一旦我添加了 .addingPercentEncoding ,它就会恢复工作,没有任何问题。

tl;dr 对于阅读本文的任何人,请尝试我上面的代码并将“urlPath”替换为您自己的本地字符串 url。

【讨论】:

请注意,这只能在函数/闭包内部使用【参考方案6】:

这对我有用

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)

【讨论】:

以上是关于Convert String to NSURL is return nil in swift的主要内容,如果未能解决你的问题,请参考以下文章

Python convert list string to list

Failed to convert from type [java.lang.Object[]] to type HashMap<String, String>的解决方法

Convert CString to ANSI string in UNICODE projects

Java——Read/convert an InputStream to a String

Excel VBA Convert Text String to Number

Excel VBA Convert Text String to Number