我正在从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中的值转换为数组?
答案 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
}
}