无法弄清楚为什么我会遇到致命错误:在展开Optional值时意外地发现了nil

时间:2015-03-24 00:37:02

标签: ios swift nsdata null nsinputstream

我一直收到这个错误:

  

致命错误:在解包可选值时意外发现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)!得到了错误。 特里

1 个答案:

答案 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。我建议阅读本iB​​ook中的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加载数据的情况。