Ios 无法理解为什么会出现致命错误:在展开可选值时意外发现nil

Ios 无法理解为什么会出现致命错误:在展开可选值时意外发现nil,ios,swift,nsdata,null,nsinputstream,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" )

我不断地发现这个错误:

致命错误:在展开可选值时意外发现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

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

PS:想上传一个屏幕但不能,因为我没有10的声誉,太糟糕了

提前谢谢

编辑:测线数据:NSData!=NSDatacontentsOfURL:url!我发现了错误。
Terry

您可能在这两行中的一行中创建了错误,但稍后可能会显示:

let data :NSData! = NSData(contentsOfURL: url)!
let stream : NSInputStream! = NSInputStream(data: data)
您正在为隐式WrappedOptional类型分配一个可选值,然后在不检查是否有有效值的情况下使用它

这就是为什么存在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的选项。我建议您阅读本书中的可选章节:

更新:


由于您在上面的评论中添加了更多内容,您的意思是您在这一行中遇到了错误:let data:NSData!=NSDatacontentsOfURL:url!。这是因为我们的关系!最后,它告诉Swift您确信此函数将返回一个有效值,因此只需使用它,而不必首先检查它是否为nil。在您的情况下,函数返回nil,因此您的应用程序崩溃。使用我上面提供的示例代码,您将看到不再发生崩溃,但您的代码将执行“未获取数据对象”行。您需要正确处理无法从该URL加载数据的情况。

因此,您选择不透露哪一行出错??不知何故,我认为您没有进行非常彻底的谷歌搜索…抱歉,让数据:NSData!=NSDatacontentsOfURL:url!线路出现了错误。是的,我做过谷歌搜索,但我无法处理。谢谢你回答戴夫。您给我的示例代码的问题是,它说条件绑定中的绑定值必须是可选类型,当涉及到if let stream=NSInputStreamdata:data时,因此我不能按它运行它,我必须将其修改为非条件绑定,但它会不断出错。顺便说一句,谢谢你的回答,作为一个初学者,我真的很高兴听到高级用户的声音。@TerryVogelsang啊,对不起,NSInputStream没有返回可选的,为你修复了示例代码。好的,谢谢!因此,现在我收到的消息是没有得到数据对象,它不再使我的应用程序崩溃,但我仍然不知道为什么数据对象没有创建,url是一个csv文件,当我悬停变量url并单击眼睛时,它会显示为它。@TerryVogelsang这是一个不同的问题,你可以在StackOverflow上创建。当我在操场上运行该代码时,它确实会从您的URL加载数据。您是否可能有防火墙或其他网络问题阻止您从测试设备访问URL?是否通过Wifi等连接?尝试执行curlhttp://gorillaapplications.com/etablissements.csv 在你的机器上的终端窗口中,确保你看到你认为会看到的东西。当我在mac终端上运行这个命令时,我得到了我想要的东西,但我不知道为什么我不在Xcode中工作。游乐场还向我输出了未获取数据对象字符串的。。。下午早些时候,它起了作用,但自从我完成了课程,我就不再工作了。奇怪的