数组索引超出范围 - 可选解除绑定时出错
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]
中……如果 settingsArray
是 nil
那么右侧可能有效 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]
。
我有一个名为 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]
中……如果 settingsArray
是 nil
那么右侧可能有效 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]
。