我有一个像这样的循环,它创建一个表示url的字符串:
for(var i = 1; i < 6; i++)
{
let urlString: String = "http://{...}/data/\(i).txt"
var downloader = FileDownloader(url: urlString, array: peopleArray, table: theTable)
downloaderQueue.addOperation(downloader)
}
FileDownloader构造函数如下:
let urlString: String
var personArray: Array<Person> = []
var person: Person
let table: UITableView
init(url: String, array: Array<Person>, table: UITableView)
{
self.urlString = url
self.person = Person()
self.personArray = array
self.table = table
}
当这段代码运行时,lldb给出了错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)
我知道问题是字符串,因为调试器输出:
downloader Lecture_14.FileDownloader 0x000000016fd89f60 0x000000016fd89f60
Foundation.NSOperation NSOperation
urlString String "unexpectedly found nil while unwrapping an Optional value"
_core _StringCore
为什么会发生这种情况的任何想法?
答案 0 :(得分:0)
在Xcode中,选择 - 单击正在使用的每个变量:urlString,peopleArray和theTable。
出现的弹出窗口会通过附加?来显示变量是否为可选变量?到班级名称。
从上面的代码中,urlString不应该是可选的,因此不应该是问题。但是检查使用中的其他变量,看看它们中是否有任何变量。
如果是这样,请使用以下内容:
if let checkedPeopleArray = peopleArray {
// now you can use checkedPeopleArray and be sure it is not nil
}
其他一些要点使您的代码更像Swift:
您的循环可以这样写,使用Swift的范围而不是传统的C风格循环:
for i in 1..<6 {
let urlString: String = "http://{...}/data/\(i).txt"
}
在声明一个数组时,Apple从第一个版本的Swift中改变了这一点。而不是:
var personArray: Array<Person> = []
尝试:
var personArray: [Person]() // empty array for Person objects
在你的初学者:
init(url: String, array: [Person], table: UITableView)
功能相同,但我觉得最好使用语言的更改,因为没有人知道Apple何时/是否可以删除旧语法。