如何使用从 Core Data 创建的 NSSet
How to use NSSet created from Core Data
我有以下核心数据模型:
Person to Codes 是一对多的关系。
我有一个函数,其中 returns 一个人记录,如果代码 person.codes
returns 一个与该人相关的所有代码的 NSSet。我遇到的问题是如何使用 NSSet。
person.codes.allObjects.first
returns这个数据:
<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
元素,但我收到错误消息:error: value of type 'Any?' has no member 'number'
此外,如何在该数据集中搜索特定代码或数字。
我明白这可能是一个简单的问题,但搜索并阅读文档无济于事。我怀疑可能基础知识不够。
更新
我有一个 CoreDataHandler class,其中包含以下代码:
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
}
}
我可以使用以下方法找人:
let row = personTableView.selectedRow
let person = CoreDataHandler.fetchPerson()?[row]
let codes = person.codes as! Set<Code>
完成后,您可以访问属性。搜索可以通过过滤来完成,例如
let filteredCodes = codes.filter({ [=11=].code == "XYZ" })
将 return 所有具有代码 "XYZ" 的对象。或者只得到一个你可以使用
let code = codes.first(where: {[=12=].id == 1})
这将 return 第一个 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: { [=13=].code == code }) {
result.append(person)
}
}
return persons
}
Core Data 支持广泛的原生 Swift 类型。
在 Person
class 中将 codes
声明为 Set<Codes>
。
比无类型 NSSet
.
方便多了
你得到一个强类型,你可以应用所有原生函数,如 filter
、sort
等,而无需类型转换。
我有以下核心数据模型:
Person to Codes 是一对多的关系。
我有一个函数,其中 returns 一个人记录,如果代码 person.codes
returns 一个与该人相关的所有代码的 NSSet。我遇到的问题是如何使用 NSSet。
person.codes.allObjects.first
returns这个数据:
<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
元素,但我收到错误消息:error: value of type 'Any?' has no member 'number'
此外,如何在该数据集中搜索特定代码或数字。
我明白这可能是一个简单的问题,但搜索并阅读文档无济于事。我怀疑可能基础知识不够。
更新
我有一个 CoreDataHandler class,其中包含以下代码:
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
}
}
我可以使用以下方法找人:
let row = personTableView.selectedRow
let person = CoreDataHandler.fetchPerson()?[row]
let codes = person.codes as! Set<Code>
完成后,您可以访问属性。搜索可以通过过滤来完成,例如
let filteredCodes = codes.filter({ [=11=].code == "XYZ" })
将 return 所有具有代码 "XYZ" 的对象。或者只得到一个你可以使用
let code = codes.first(where: {[=12=].id == 1})
这将 return 第一个 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: { [=13=].code == code }) {
result.append(person)
}
}
return persons
}
Core Data 支持广泛的原生 Swift 类型。
在 Person
class 中将 codes
声明为 Set<Codes>
。
比无类型 NSSet
.
方便多了
你得到一个强类型,你可以应用所有原生函数,如 filter
、sort
等,而无需类型转换。