数组索引超出范围 – 可select解除绑定时出错
我有一个叫做Settings
的实体,它有一个叫做Int
types的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]
…如果settingsArray
是nil
那么右侧可能有效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]
。