“人与代码”是一对多关系。
我有一个返回Person记录的函数,如果代码person.codes
返回与该Person关联的所有代码的NSSet。我遇到的问题是如何使用NSSet。
person.codes.allObjects.first
返回以下数据:
<Codes: 0x60000213cb40> (entity: Codes; id: 0xb978dbf34ddb849 <x-coredata://A2B634E4-E136-48E1-B2C5-82B6B68FBE44/Codes/p1> ; data: {
code = 4LQ;
number = 1;
whosAccount = "0xb978dbf34ddb869 <x-coredata://A2B634E4-E136-48E1-B2C5-82B6B68FBE44/Person/p1>";
})
我认为如果我将person.codes.allObjects.first
设置为Codes
类型,我将能够访问code
和number
元素,但是会出现错误:{{1} }
此外,如何在此数据集中搜索特定的代码或数字。
我很欣赏这可能是一个简单的问题,但是已经搜索并阅读了文档,无济于事。我怀疑基础知识可能不足。
我有一个CoreDataHandler类,其中包含以下代码:
error: value of type 'Any?' has no member 'number'
我可以使用以下方法来获取一个人
class CoreDataHandler: NSObject {
//static let sharedInstance = CoreDataHandler()
private static func getContext() -> NSManagedObjectContext {
let appDelegate = NSApplication.shared.delegate as! AppDelegate
return appDelegate.persistentContainer.viewContext
}
static func fetchPerson() -> [Person]? {
let context = getContext()
do {
let persons: [Person] = try context.fetch(Person.fetchRequest())
return persons
} catch {
return nil
}
}
答案 0 :(得分:1)
Core Data支持广泛的本机Swift类型。
在codes
类中将Set<Codes>
声明为Person
。
它比 typeless NSSet
方便得多。
您将获得一个强类型,并且无需进行类型转换即可应用filter
,sort
等所有本机函数。
答案 1 :(得分:0)
let codes = person.codes as! Set<Code>
完成后,您可以访问属性。搜索可以通过过滤实例来完成
let filteredCodes = codes.filter({ $0.code == "XYZ" })
将返回所有具有代码“ XYZ”的对象。或仅获得一个即可使用
let code = codes.first(where: {$0.id == 1})
将返回第一个ID = 1的对象
一个简单的示例,获取具有给定代码的所有Person对象
func findWithCode(_ code: String) -> [Person] {
guard let persons = CoreDataHandler.fetchPerson() else {
return []
}
var result = [Person]()
for person in persons {
let codes = person.codes as! Set<Code>
if codes.contains(where: { $0.code == code }) {
result.append(person)
}
}
return persons
}