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.
加载数据的情况
我一直收到这个错误:
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.