我有一个名为Settings
的实体,其属性为backgroundColor
,类型为Int
,如果 1 ,则视图控制器将具有如果 0 则为白色,然后是深灰色背景。
但是在尝试打开视图控制器时出现以下错误;
致命错误:数组索引超出范围
对于我的函数中的以下行
if settingsArray.count == 1 {
setting = settingsArray[1]
} else if settingsArray.count <= 0 {
println("No settings in array")
}
查看控制器
var settingsArray: [Settings]!
var setting: Settings!
var backgroundSetting: Bool = true
override func viewWillAppear(animated: Bool) {
backgroundSettings()
}
override func viewDidLoad() {
super.viewDidLoad()
backgroundSettings()
}
// Function to fetch settings and change background
func backgroundSettings() {
var error: NSError?
let request = NSFetchRequest(entityName: "Settings")
self.settingsArray = moc?.executeFetchRequest(request, error: &error) as! [Settings]
if settingsArray.count == 1 {
setting = settingsArray[1]
} else if settingsArray.count <= 0 {
println("No settings in array")
}
if setting != nil {
if setting.backgroundColor == 1 {
backgroundSetting = true
} else if setting.backgroundColor == 0{
backgroundSetting = false
}
}
if backgroundSetting == true {
self.view.backgroundColor = UIColor.whiteColor()
} else if backgroundSetting == false {
self.view.backgroundColor = UIColor.darkGrayColor()
}
}
//Button to change the color and settings
@IBAction func backgroundColor(sender: AnyObject) {
if setting != nil {
if setting.backgroundColor == 1 {
setting.backgroundColor = 0
} else {
setting.backgroundColor = 1
}
var error: NSError?
moc?.save(&error)
} else {
println("No settings available")
var settings = NSEntityDescription.insertNewObjectForEntityForName("Settings", inManagedObjectContext: moc!) as! Settings
settings.backgroundColor = 1
var error: NSError?
moc?.save(&error)
}
backgroundSettings()
}
我可能出错的任何想法?
答案 0 :(得分:5)
在Swift中(如在Objective C和许多其他语言中),数组的索引从0开始。(参见this wikipedia article for a list on this.)
这意味着当您选中if settingsArray.count == 1
时,列表中只会有(确切)一个项目。由于索引从0开始,因此该项将位于索引0处,因此为错误。
因此,您要检查settingsArray.count == 2
是否离开setting = settingsArray[1]
,还是更改为setting = settingsArray[0]
。
答案 1 :(得分:-1)
ETA:
我一直在考虑另一个。我在下面留下了我的旧答案,以便之前的评论有意义。
在if let thisSetting = settingsArray?[0]
...如果settingsArray
为nil
,则右侧可能有效nil[0]
。因此,我认为这可以消除崩溃:
// ...
if !settingsArray.isEmpty {
if let thisSetting = settingsArray?[0] {
setting = thisSetting
}
}
settingsArray[0]
nil
我认为这是一个单独的问题。我认为这与生命周期有关。
以前的答案如下:
我认为问题可能是由于您从func backgroundSettings()
调用viewDidLoad()
- 即在视图控制器生命周期中过早 - 以及在值初始化之前引起的。