我需要帮助将Core Data的结果转换为Swift 3中的数组

时间:2016-10-07 04:05:22

标签: arrays core-data swift3 xcode8

我正在从Core Data中进行简单的提取,并使用谓词过滤结果,具有以下内容:

do {
    let request: NSFetchRequest<CSTProjectDetails> = CSTProjectDetails.fetchRequest()
    request.predicate = NSPredicate(format: "projectID == %@", cstProjectID)
    cstProjectDetails = try context.fetch(request)
} catch {
    print("There was an error fetching CST Project Details.")
}

当我尝试打印以下详细信息时,我得到以下内容。

print("CSTProjectDetails: \(cstProjectDetails)")

这会产生这样的结果:

  

CSTProjectDetails:[(实体:   CSTProjectDetails; id:0xd000000000080004    ;数据:),(实体:   CSTProjectDetails; id:0xd0000000000c0004    ;数据:),(实体:   CSTProjectDetails; id:0xd000000000100004    ;数据:),(实体:   CSTProjectDetails; id:0xd000000000140004    ;数据:),(实体:   CSTProjectDetails; id:0xd000000000180004    ;数据:))


我尝试将“cstProjectDetails”转换为数组,并对结果进行一些测试:

let hrData = self.cstProjectDetails as NSArray
print("There are \(hrData.count) items in this project")

这实际上会打印出从Core Data中提取的正确数量的项目。

如果我这样做:

dump(hrData)

我得到这样的东西:

  
      
  • (实体:CSTProjectDetails; id:0xd000000000080004    ;数据:))#1      
        
    • super:LogsterBeta3.CSTProjectDetails      
          
      • super:NSManagedObject
      •   
    •   
    • (实体:CSTProjectDetails; id:0xd0000000000c0004    ;数据:)#2
    •   
    • super:LogsterBeta3.CSTProjectDetails      
          
      • super:NSManagedObject
      •   
    •   
    • (实体:CSTProjectDetails; id:0xd000000000100004    ;数据:)#3
    •   
    • super:LogsterBeta3.CSTProjectDetails      
          
      • super:NSManagedObject
      •   
    •   
    • (实体:CSTProjectDetails; id:0xd000000000140004    ;数据:)#4
    •   
    • super:LogsterBeta3.CSTProjectDetails      
          
      • super:NSManagedObject
      •   
    •   
    • (实体:CSTProjectDetails; id:0xd000000000180004    ;数据:)#5
    •   
    • super:LogsterBeta3.CSTProjectDetails      
          
      • super:NSManagedObject
      •   
    •   
  •   

有了所有这些,我试图在循环中访问实体的属性,如下所示:

for logDetails in hrData {
    print (logDetails.species)
}

然而,这会立即产生错误,称“物种”不是有效成员。

有谁能让我知道我在这里失踪了什么?如何将NSFetchRequest中的值转换为数组?

2 个答案:

答案 0 :(得分:2)

  

如何将NSFetchRequest中的值转换为数组?

你不必得到&#34;得到&#34;任何事情&#34;成阵列&#34;。调用fetch 的结果是一个数组。你有一个数组开始。

然后你做了一件非常奇怪的事:你将hrData投射到NSArray。好吧,NSArray没有元素类型。所以现在当你说

for logDetails in hrData {

Swift没有关于logDetails甚至 的内容的任何信息。它只是将它键入AnyObject。

如果要提取其species属性,则需要将logDetails强制转换为实际属性,即CSTProjectDetails。

或者,不要强制转换为NSArray,因为这会删除您的元素类型信息。转换为Swift数组的CSTProjectDetails。现在,Swift将从一开始就拥有类型信息。

答案 1 :(得分:0)

试试这个

class TableViewVC: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate {

@IBOutlet weak var tableView: UITableView!

var cstProject: CstProjectDetails?
var cstProjectDetails = [CstProjectDetails]()
let controller = CoredataController()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
        cstProjectDetails = controller.fetchCstProjectDetails()
    }

    override func viewDidAppear(_ animated: Bool) {
        tableView.reloadData()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cstProjectDetails.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "CstProjectDetailsCell", for: indexPath) 

            self.cstProject = cstProjectDetails[indexPath.row]
            cell.configureCell(cstProjectDetails: cstProject!)
            return cell
}

class CoredataController: NSObject, NSFetchedResultsControllerDelegate {

    func fetchCstProjectDetails() -> [CstProjectDetails] {

        var cstProjectDetails = [CstProjectDetails]()
        let fetchProject: NSFetchRequest<CstProjectDetails> = CstProjectDetails.fetchRequest()

        do {
            let fetchedResult = try context.fetch(fetchCstProjectDetails)

            for project in fetchedResult as [NSManagedObject] {
                cstProjectDetails.append(project as! CstProjectDetails)
            }

        } catch {

            let error = error as NSError
            print("ATTEMPT FETCH ERROR IS: \(error)")
        }
        return cstProjectDetails
    }
}