我正在处理一个项目,在该项目中我遇到了一个问题,试图从核心数据中的 .txt 数据更新 UISwitch 标记值。出现问题:let currentGroup = tagResults[0].xGroup 在那里我得到线程 1:致命错误:索引超出范围。我一直在这里拔头发。我不确定为什么我不断收到此错误。任何帮助将不胜感激。
完整代码:
override func viewDidLoad() {
super.viewDidLoad()
let appDelegate = UIApplication.shared.delegate as? AppDelegate
managedObjectContext = appDelegate?.managedObjectContext
insertXORData()
let request: NSFetchRequest<XOR> = XOR.fetchRequest()
request.predicate = NSPredicate(format: "tag != nil", argumentArray: [#keyPath(XOR.tag)])
do {
let results = try managedObjectContext?.fetch(request)
currentGroup = results?.first
populate(xOR: (results?.first)!)
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
}
func populate(xOR: XOR) {
guard let tag = xOR.tag as NSNumber?, let xGroup = xOR.xGroup as NSNumber? else { return }
print("xOrDict: \(tag),\(xGroup)")
}
@IBAction func xOrSwitches(_ sender: UISwitch) {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "XOR")
let tagPredicate = NSPredicate(format: "tag == %i", sender.tag)
fetchRequest.predicate = tagPredicate
var tagResults = [XOR]()
do {
tagResults = try managedObjectContext!.fetch(fetchRequest) as! [XOR]
} catch let xOrError as NSError {
print("Error fetching XOR: \(xOrError)")
}
let currentGroup = tagResults[0].xGroup
let xPredicate = NSPredicate(format: "xGroup == %@", currentGroup)
fetchRequest.predicate = xPredicate
var groupResults = [XOR]()
do {
groupResults = try managedObjectContext!.fetch(fetchRequest) as! [XOR]
} catch let groupError as NSError {
print("Error fetching XOR: \(groupError)")
}
if sender.isOn {
for member in groupResults {
if member.tag.intValue != sender.tag {
form?.setValue(false, forKey: "switch\(member.tag)")
} else {
form?.setValue(true, forKey: "switch\(member.tag)")
}
}
} else {
form?.setValue(false, forKey: "switch\(sender.tag)")
}
form?.setValue(true, forKey: "updateNeeded")
print("update needed for \(String(describing: form))")
if let list = switchList {
for toggle in list {
guard let toToggle = form?.value(forKey: "switch\(toggle.tag)") as? Bool else {return}
toggle.setOn(toToggle, animated: true)
}
}
}
func insertXORData() {
let fetch: NSFetchRequest<XOR> = XOR.fetchRequest()
fetch.predicate = NSPredicate(format: "tag != nil")
guard let count = try! managedObjectContext?.count(for: fetch) else { return }
if count > 0 {
// xOrGroup.txt data already in Core Data
return
}
let path = Bundle.main.path(forResource: "xOrGroup", ofType: "txt")
let dataArray = NSArray(contentsOfFile: path!)!
for dict in dataArray {
guard let managedObjectContext = managedObjectContext else {return}
let entity = NSEntityDescription.entity(forEntityName: "XOR", in: managedObjectContext)!
let xOR = XOR(entity: entity, insertInto: managedObjectContext)
let xORDict = dict as! [String: Any]
xOR.tag = xORDict["tag"] as! NSNumber
xOR.xGroup = xORDict["xGroup"] as! NSNumber
}
try! managedObjectContext?.save()
}
我在控制台中得到的错误代码: 致命错误:索引超出范围:文件 Swift/ContiguousArrayBuffer.swift,第 444 行 2021-03-19 17:14:22.855358-0700 FDA[4842:1616264] 致命错误:索引超出范围:文件 Swift/ContiguousArrayBuffer.swift,第 444 行 (lldb)