带有`\(var)`的字符串会导致"展开一个可选值"错误

时间:2015-03-09 00:59:09

标签: ios uitableview swift uikit

我有一个像这样的循环,它创建一个表示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

为什么会发生这种情况的任何想法?

1 个答案:

答案 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何时/是否可以删除旧语法。