我目前正在开发一款应用,但出于某种原因,阵列会自动清空。
我首先在文件的顶部提到它:
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
文件。
答案 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
,您要创建一个同名的本地范围数组