2014-09-03 18 views
0

试图从Yahoo Finance获取S & P500(symbol:^ GSPC)的数据。在操场和脚本中,字符串中存在^(^)字符串,传递给NSURL错误,“执行被中断,原因:EXC_BAD_INSTRUCTION(code = EXC_1386_INVOP,sub code = 0x0)”。 Xcode 6b6和b7。字符串中的字符^的NSURL错误

适用于其他股票代码(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) 

回答

4

它崩溃,因为斯威夫特(至少在Xcode6-β7的)不支持从一个对象初始化返回nil。从发行说明:

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

解决方法:如果有工厂方法,请改用它。否则, 捕获可选结果。例如:

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

所以,为了避免撞车,声明您financeNSURLNSURL?(如从上面的文档的例子),或使用NSURL.URLWithString()代替init(string:)

但是,问题的根源在于您没有正确编码URL参数。

如果您在symbols调用stringByAddingPercentEncodingWithAllowedCharacters(...)它的工作原理:

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%" 
+0

根据文档,当字符串没有正确编码,然后在Swift中似乎没有其他方式比崩溃。但我同意,从开发人员的角度来看,这不是一个理想的行为。 – CouchDeveloper 2014-09-03 19:16:14

+0

@CouchDeveloper是的,是。我编辑了答案来解释崩溃并提供了当前的解决方法。 – 2014-09-03 19:37:03

+0

现在解释得非常好。 ;) – CouchDeveloper 2014-09-03 19:40:05

2

当创建使用init方法NSURLNSURLWithString:参数URLString必须是正确编码网址串。你的不是。那么,这是一个“正确编码的URL字符串”呢?

相应的官方文件给出了几个线索在哪里阅读:

URLString:URL字符串与初始化NSURL对象时,此URL字符串必须在RFC 2396描述符合URL格式,并且不能是nil。该方法根据RFCs 17381808解析URLString。“ (链接是我的)。

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

这可能很乏味,而且肯定会出错。因此,由于iOS 8有NSURLComponentssee docs here)可以帮助您完成此任务。