如何从获取请求数组结果中构建字典?

Posted

技术标签:

【中文标题】如何从获取请求数组结果中构建字典?【英文标题】:how to build a dictionary from the fetch request array result? 【发布时间】:2017-03-24 18:42:38 【问题描述】:

我偶然发现了一个表格视图,它包含基于实体属性和数字的多个部分。基于同一实体的另一个属性的单元格。我有一个名为 Floors 的实体(可以存在多个实例),它有 2 个属性:楼层号和楼层上的房间数。我执行了一个获取请求,它返回了数组。我的知识不足以弄清楚如何设置这样的字典: [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

【问题讨论】:

【参考方案1】:

假设 storedFloors 包含所有楼层(即部分),您不需要字典,只需使用:

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

【讨论】:

非常感谢您花时间帮助我。但是当我运行你的实现时,我有一个致命的错误,上面写着“索引超出范围”。你能告诉我为什么吗? 你能发布给你错误的确切代码吗? override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int return Int(storedFloors[section - 1].numberOfRooms) // 索引超出范围 我的错误:将 section - 1 替换为 section(已在答案中编辑)。应该这样做 感谢您的帮助,它有效。先生,祝您有愉快的一天。

以上是关于如何从获取请求数组结果中构建字典?的主要内容,如果未能解决你的问题,请参考以下文章

Swift Vapor 服务器:如何在获取请求中返回嵌套字典?

如何在 Alamofire 获取请求中调用包含变量或常量的结构到字典中

如何在 indexPath 的 cellForRow 中使用多个获取请求结果数组

为啥我无法从 Alamofire 获取请求结果

如何解决 Node.js 中的“请求过多”错误?

使用 alomafier 请求调用 api 在响应中获取数据,但在请求下方它会变为空白