阵列自发清空

时间:2015-05-20 23:07:20

标签: ios swift

我目前正在开发一款应用,但出于某种原因,阵列会自动清空。

我首先在文件的顶部提到它:

let scaleTypes = [String]()

然后我填充它(我通过运行数组的println来验证它的填充):

let scaleTypes = scaleTypesDict.valueForKey("Types")! as! [String]
println(scaleTypes.count)

当我访问数组时(填充UITableViewCells的内容时):

cell.textLabel!.text = scaleTypes[indexPath.row]

我得到fatal error: Array index out of range。我在访问数组之前直接完成了数组计数的打印,并发现它已经自动清空(它打印0)。该文件中的其他位置未提及该数组。我在这个应用程序中的另一个视图控制器中使用了类似的变量名称,但我非常怀疑这是否会导致问题。有人得到了什么?

编辑:如果查看整个源代码会有所帮助,可以在此处找到:https://gitlab.carson-greene.com/cgreene/scales-ios/tree/dev/Scale%20Randomizer。不幸的是,我还没有对事情做好评论;被警告。发生此错误的文件是SRSettingsViewController.swift文件。

3 个答案:

答案 0 :(得分:3)

第二次编写let scaleTypes时,您声明了一个 new 数组,该数组是其所在方法的本地数据。

将您的第一个let更改为var,然后在以后附加值而不是制作新数组。

另外,你不应该使用valueForKey()。只需使用键控下标:

// Declare the variable as mutable
var scaleTypes = [String]()


// Later, add new variables…
if let newScales = scaleTypesDict["Types"] as? [String] {
    scaleTypes += newScales
}

答案 1 :(得分:3)

您正在声明两个名为scaleTypes的不同变量。

第一个是成员变量,由于您使用let声明然后初始化为空,因此永远不会包含任何内容。

然后,在您的viewDidLoad中,您宣布一个名为scaleTypes new 本地变量。您将值放入其中,但它仅在您的viewDidLoad函数运行时存在,它会屏蔽成员变量。当该功能退出时,它会消失。

在其他函数的其他地方,当您访问scaleTypes时,您正在访问该空成员变量。

如果您使用var声明成员变量,然后将let放在viewDidLoad中的作业前面,则会将值分配给成员变量我希望。

答案 2 :(得分:2)

在填充数组之前删除let,您要创建一个同名的本地范围数组