我一直收到这个错误:
致命错误:在解包可选值时意外发现nil
并且无法弄清楚如何调试它!
这是我的代码:
func readCSV() -> Array<String> {
// Creates a new array of strings
var csvArray : Array<String> = Array<String>()
if let url: NSURL = NSURL(string : "URLFROMCSV" ) {
// Creates an Input Stream that will load the datas from our URL
let data :NSData! = NSData(contentsOfURL: url)!
let stream : NSInputStream! = NSInputStream(data: data)
// Opens the receiving stream
stream.open()
// Sets a buffer with a given size size
let bufferSize = 1024
var buffer = Array <UInt8>(count: bufferSize, repeatedValue: 0)
// String variable initialization
var csvFullString : String = ""
// While the stream receives datas, parses datas, convert them into strings and then concatenate them into one big string
while (stream.hasBytesAvailable) {
let readSize = stream.read(&buffer, maxLength: bufferSize)
let csvRaw = NSString (bytes: &buffer, length: readSize, encoding: NSUTF8StringEncoding)
let csvString = csvRaw as String!
csvFullString = csvFullString + csvString
}
// Fills the array with each strings. Separation between strings is made when a Θ character is parsed
csvArray = csvFullString.componentsSeparatedByString("Θ")
// Delete each null string
for(var i = 0 ; i < csvArray.count; i++) {
if(csvArray[i] == "") {
csvArray.removeAtIndex(i)
}
}
}
return csvArray
}
在网上搜索之后,我很确定它与展开元素有关,但事实是当我调试它时,我在任何地方都没有任何值。
PS:想上传一个屏幕却不能因为我没有10个声誉,那么糟糕!提前致谢!
编辑:行让数据:NSData! = NSData(contentsOfURL:url)!得到了错误。 特里
答案 0 :(得分:0)
你可能在这两行中的一行中创建错误(虽然它可能会在稍后出现):
let data :NSData! = NSData(contentsOfURL: url)!
let stream : NSInputStream! = NSInputStream(data: data)
您正在为implicitlyUnwrappedOptional类型分配一个可选值,然后使用它而不检查您是否具有有效值。
这就是if let
存在的原因。你开始缩进就好像你正在使用if let
但是没有。
请改为尝试:
if let url = NSURL(string : "http://gorillaapplications.com/etablissements.csv" ) {
// Creates an Input Stream that will load the datas from our URL
if let data = NSData(contentsOfURL: url) {
let stream = NSInputStream(data: data)
stream.open()
// rest of your code here
}
else {
println("Didn't get a data object")
}
}
else {
println("Didn't get a URL object")
}
你真的需要掌握Swift的Optionals。我建议阅读本iBook中的Optionals章节:https://itunes.apple.com/us/book/swift-optionals-generics-for/id943445214?mt=11&uo=4&at=11lMGu
<强>更新强>
由于您在上面的评论中添加了更多内容,因此您说这行错误:let data: NSData! = NSData(contentsOfURL: url)!
。这是因为最后的!
告诉Swift你确定这个函数会返回一个有效值,所以只需使用它,而不先检查它是nil
。在您的情况下,该函数返回nil
,因此您的应用程序崩溃。使用我上面提供的示例代码,您将看到您不会再崩溃,但您的代码将执行"Didn't get a data object"
行。您需要正确处理无法从该URL加载数据的情况。