数组索引超出范围 – 可select解除绑定时出错

我有一个叫做Settings的实体,它有一个叫做Inttypes的backgroundColor属性,如果它是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() } 

任何想法,我可能会出错?

ETA:

我一直在想这件事。 我已经在下面留下了我的旧的回答,以便以前的意见是有道理的。

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

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

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

以前的答案如下:

我相信这个问题可能是由你从viewDidLoad()调用func backgroundSettings() viewDidLoad() – 也就是在View Controller生命周期中太早 – 并且在这些值被初始化之前造成的。

在Swift中(就像在Objective C和许多其他语言中一样),数组的索引从0开始。(请参阅这篇维基百科文章以获得列表)

这意味着当你检查if settingsArray.count == 1 ,你的列表中只有(正好)一个项目。 由于索引从0开始,因此该项目将位于索引0,因此是错误。

因此,要么检查settingsArray.count == 2并将setting = settingsArray[1] ,或者更改为setting = settingsArray[0]