Can't figure out why I get a fatal error: unexpectedly found nil while unwrapping an Optional value

Can't figure out why I get a fatal error: unexpectedly found nil while unwrapping an Optional value

我一直收到这个错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

并且不知道如何调试它!

这是我的代码:

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

}

在网上搜索后,我很确定它与展开元素有关,但事实是当我调试它时,我在任何地方都没有得到任何 nil 值。

PS: 想上传屏幕但是不能因为我没有10个声望,太糟糕了!

提前致谢!

EDIT : Line let data :NSData! = NSData(contentsOfURL: url)!得到了错误。 特里

您可能在这两行之一中创建了错误(尽管稍后可能会出现):

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 的选项。我建议阅读这本 iBook 中的可选章节:https://itunes.apple.com/us/book/swift-optionals-generics-for/id943445214?mt=11&uo=4&at=11lMGu

更新:

由于您在上面的评论中添加了更多内容,所以您说您在这一行收到了错误:let data: NSData! = NSData(contentsOfURL: url)!。这是因为最后的 ! 告诉 Swift 你确定这个函数将 return 一个有效值,所以只使用它,而不检查它是否是 nil 首先。在您的情况下,该功能是 returning nil ,因此您的应用程序崩溃了。使用我在上面提供的示例代码,您会发现不会再发生崩溃,但您的代码将执行 "Didn't get a data object" 行。您需要正确处理无法从 URL.

加载数据的情况