数组索引超出范围 - 可选解除绑定时出错

时间:2015-07-26 17:47:15

标签: ios arrays swift core-data optional

我有一个名为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()

}

我可能出错的任何想法?

2 个答案:

答案 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] ...如果settingsArraynil,则右侧可能有效nil[0]。因此,我认为这可以消除崩溃:

// ...
if !settingsArray.isEmpty {
    if let thisSetting = settingsArray?[0] {
        setting = thisSetting
    }
}

settingsArray[0] nil我认为这是一个单独的问题。我认为这与生命周期有关。

以前的答案如下:

我认为问题可能是由于您从func backgroundSettings()调用viewDidLoad() - 即在视图控制器生命周期中过早 - 以及在值初始化之前引起的。