Swift 如何从获取请求数组结果构建字典?
我无意中建立了一个表视图,其中包含基于实体属性的多个部分,以及基于同一实体的另一个属性的单元格数。我有一个名为Floors的实体(可以存在多个实例),它有两个属性:floor number和floor上的房间数。我执行了一个获取请求,它返回了数组。我的知识还不足以计算如何设置这样的字典:[floorNumber:numberOfRoomsInFloor]这样我就可以用它来定义表中的节数和每个节中的行数。我尝试过,但失败了,我确实在网站上查看过线程,但我真的没有看到一个适合我的解决方案。如果有人能花点时间帮我,这对我来说意义重大。请查看下面我的代码:Swift 如何从获取请求数组结果构建字典?,swift,core-data,swift3,nsmanagedobjectcontext,nsfetchrequest,Swift,Core Data,Swift3,Nsmanagedobjectcontext,Nsfetchrequest,我无意中建立了一个表视图,其中包含基于实体属性的多个部分,以及基于同一实体的另一个属性的单元格数。我有一个名为Floors的实体(可以存在多个实例),它有两个属性:floor number和floor上的房间数。我执行了一个获取请求,它返回了数组。我的知识还不足以计算如何设置这样的字典:[floorNumber:numberOfRoomsInFloor]这样我就可以用它来定义表中的节数和每个节中的行数。我尝试过,但失败了,我确实在网站上查看过线程,但我真的没有看到一个适合我的解决方案。如果有人能
class RoomAndAlarmTypeTableVC: UITableViewController, NSFetchedResultsControllerDelegate {
//MARK: - Properties
private var managedObjectContext: NSManagedObjectContext!
private var storedFloors = [Floors]()
private var floorsAndRooms = [String: String]()
//MARK: - Actions
override func viewDidLoad() {
super.viewDidLoad()
managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
loadFloorData()
tableView.delegate = self
tableView.dataSource = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
private func loadFloorData() {
let floorRequest: NSFetchRequest<Floors> = Floors.fetchRequest()
do {
storedFloors = try managedObjectContext.fetch(floorRequest)
print("\(storedFloors)")
} catch {
print("could not load data from core \(error.localizedDescription)")
}
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return storedFloors.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let specificFloor = storedFloors[section]
return Int(specificFloor.numberOfRooms)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "house cell", for: indexPath) as! ViewRooomNumberCell
let tableSections = storedFloors[indexPath.section]
let floorItem = tableSections.numberOfRooms[indexPath.row]
let floorNumber = String(floorItem.numberOfRooms)
cell.floorNumberTxt.text = floorNumber
return cell
}
class RoomAndAlarmTypeTableVC:UITableViewController,NSFetchedResultsControllerDelegate{
//标记:-属性
私有var managedObjectContext:NSManagedObjectContext!
私有var storedFloors=[楼层]()
private var floorsAndRooms=[String:String]()
//马克:行动
重写func viewDidLoad(){
super.viewDidLoad()
managedObjectContext=(UIApplication.shared.delegate为!AppDelegate)。persistentContainer.viewContext
loadFloorData()
tableView.delegate=self
tableView.dataSource=self
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//处置所有可以重新创建的资源。
}
私有函数loadFloorData(){
let floorRequest:NSFetchRequest=Floors.fetchRequest()
做{
storedFloors=尝试managedObjectContext.fetch(floorRequest)
打印(“\(storedFloors)”)
}抓住{
打印(“无法从core\(error.localizedDescription)加载数据”)
}
}
//标记:-表视图数据源
重写func numberOfSections(在tableView:UITableView中)->Int{
返回storedFloors.count
}
重写func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
let Specific Floor=存储楼层[截面]
返回整数(具体楼层、房间数)
}
重写func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
让cell=tableView.dequeueReusableCell(标识符为:“house cell”,for:indexPath)作为!ViewRooomNumberCell
让tableSections=storedFloors[indexPath.section]
设floorritem=tableSections.numberOfRooms[indexPath.row]
让floorNumber=字符串(floorItem.numberOfRooms)
cell.floorNumberTxt.text=floorNumber
返回单元
}
}假设StoredFloor包含所有楼层(即部分),您不需要字典,只需使用:
override func numberOfSections(in tableView: UITableView) -> Int {
return storedFloors.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// this will return the proper number of rows (rooms) for each section
return storedFloors[section].numberOfRooms
}
非常感谢你抽出时间来帮助我。但是我有一个致命的错误,当我运行您的实现时,它说“索引超出范围”。你能告诉我为什么吗?你能给出给出错误的确切代码吗?重写func tableView(utableview:UITableView,numberofrowsinssection:Int)->Int{return Int(storedFloors[section-1].numberOfRooms)//索引超出范围}我的错误:用section(答案中已编辑)替换section-1。这应该感谢你的帮助,这很有效。祝您愉快,先生。