NSURL错误与字符串中的插入符号^

时间:2014-09-03 14:28:33

标签: xcode swift

试图从雅虎财经获取S& P500(符号:^ GSPC)的数据。在游乐场和脚本中,字符串中的插入符号(^)传递给NSURL错误,“执行被中断,原因:EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码= 0x0)”。 Xcode 6b6和b7。

适用于其他股票代码(AAPL,MSFT等)。

有关如何使其正常工作的任何建议吗?

let symbols:String = "^GSPC"
let financeURL:String = "http://finance.yahoo.com/d/quotes.csv?s=\(symbols)&f=sl1c6p2"

var financeNSURL: NSURL = NSURL(string: financeURL) // ERROR (see above)
let tickerNSData: NSData = NSData(contentsOfURL: financeNSURL)

var output:NSString = NSString(data:tickerNSData, encoding:NSUTF8StringEncoding)

2 个答案:

答案 0 :(得分:4)

由于Swift(至少在Xcode6-Beta7中)不支持从对象初始值设定项返回nil,所以它崩溃了。从发行说明:

  

Swift不支持通过返回失败的对象初始值设定项   空值。 (16480364)

     

解决方法:如果有工厂方法,请改用它。除此以外,   在可选项中捕获结果。例如:

     

let url: NSURL? = NSURL(string: "not a url")

因此,为了避免崩溃,请将financeNSURL声明为NSURL?(如上文中的示例所示),或使用NSURL.URLWithString()代替init(string:)。< / p>

然而,问题的根源在于您未正确编码网址参数。

如果您在stringByAddingPercentEncodingWithAllowedCharacters(...)上致电symbols,则可以:

let symbols:String = "^GSPC".stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
let financeURL:String = "http://finance.yahoo.com/d/quotes.csv?s=\(symbols)&f=sl1c6p2"

let financeNSURL: NSURL? = NSURL(string: financeURL)
if let url = financeNSURL {
    let tickerNSData: NSData = NSData(contentsOfURL: url)

    var output:NSString = NSString(data:tickerNSData, encoding:NSUTF8StringEncoding)
}

输出:

"^GSPC",1999.83,"-2.45","-0.12%"

答案 1 :(得分:2)

使用init方法NSURL创建NSURLWithString:时,参数 URLString 必须是正确编码的 URL字符串。你的不是。那么,这是一个“正确编码的URL字符串”是什么?

相应的官方文档提供了一些提示:

URLString :用于初始化NSURL对象的URL字符串。此URL字符串必须符合RFC 2396中所述的URL格式,且不得为{ {1}}。此方法根据RFCs 17381808解析nil。“ (链接是我的。)

基本上,您需要使用百分比编码算法的正确变体分别对源字符串组件中的每个URL组件进行编码。然后,将所有编码的字符串组件组合成最终的URL字符串。

这可能很乏味,而且肯定容易出错。因此,从iOS 8开始,URLStringsee docs here)可以帮助您完成此任务。