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

Array Index Out Of Range - Error when optional unbinding

我有一个名为 Settings 的实体,其属性名为 backgroundColor,类型为 Int,如果它是 1,则视图控制器如果 0 则背景为白色,则背景为深灰色。

但是我在尝试打开视图控制器时遇到以下错误;

fatal error: Array Index out of range

对于我函数中的以下行

    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()

}

我有什么地方可能出错的想法吗?

预计到达时间:

我一直在考虑这个问题。我在下面留下了我的旧答案,以便以前的评论有意义。

if let thisSetting = settingsArray?[0] 中……如果 settingsArraynil 那么右侧可能有效 nil[0]。因此我相信这可以消除崩溃:

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

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

之前的回答如下:

我认为问题可能是由您从 viewDidLoad() 调用 func backgroundSettings() 引起的 - 即在 View Controller 生命周期中太早 - 并且在初始化值之前。

在 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]