4 generics core-data ios swift
编辑:专门使用 Swift 泛型
我想要为我的所有实体提供一个 countAll() 函数,并且我希望通过编写一个通用函数来实现这一目标。
以下处理一个名为“Event”的实体,但我想处理一个名为“T”的实体。
我不知道如何编写这样的通用函数。有人可以帮忙吗?
func countAll() -> Int {
let request: NSFetchRequest<Event> = Event.fetchRequest()
do {
return try persistentContainer.viewContext.count(for: request)
} catch {
XCTAssert(false, "Core Data failed to fetch with error: " + error.localizedDescription)
return 0
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在遇到错误之前能得到的最接近的结果:
func count<T: NSFetchRequestResult>(entityName: String) -> Int {
let request = NSFetchRequest<T>(entityName: entityName)
do {
return try persistentContainer.viewContext.count(for: request)
} catch {
XCTAssert(false, "Core Data failed to fetch with error: " + error.localizedDescription)
return 0
}
}
Run Code Online (Sandbox Code Playgroud)
您可以传递托管对象类而不是传递NSFetchRequestResult
给通用函数:
func countAll<T: NSManagedObject>(entity: T.Type) -> Int {
let entityName = String(describing: entity)
let request = NSFetchRequest<T>(entityName: entityName)
do {
return try thePersistentContainer.viewContext.count(for: request)
} catch {
print(error.localizedDescription)
return 0
}
}
let count = countAll(entity: YourEntity.self)
Run Code Online (Sandbox Code Playgroud)
另一种方法是定义扩展方法NSManagedObject
(类似于如何在 NSManagedObject Swift 扩展中创建托管对象子类的实例?):
extension NSManagedObject {
class func countAll() -> Int {
let eName = String(describing: self)
let request = NSFetchRequest<NSFetchRequestResult>(entityName: eName)
do {
return try thePersistentContainer.viewContext.count(for: request)
} catch {
print(error.localizedDescription)
return 0
}
}
}
let count = YourEntity.countAll()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3574 次 |
| 最近记录: |