如何 运行 Swift 核心数据实体上的通用方法,更聪明的方法
How to run a generic method on a core data entity on Swift, the smarter way
我有很多核心数据实体,它们都有这个方法:
class func count(_ context:NSManagedObjectContext) -> Int
假设实体被称为:汽车、公共汽车、飞机等
我想做的就是这个,就像我平时做的那样。
let carCount = Car.count(coreDataContext)
个
let busCount = Bus.count(coreDataContext)
但是,如前所述,我只有实体名称
我如何 运行 仅通过该实体的名称从该实体中获取该方法?
创建具有关联类型的协议
protocol Fetchable
{
associatedtype FetchableType: NSManagedObject = Self
static var entityName : String { get }
static func count(_ context: NSManagedObjectContext) throws -> Int
}
和协议扩展
extension Fetchable where Self : NSManagedObject
{
static var entityName : String { return String(describing:self) }
static func count(_ context: NSManagedObjectContext) throws -> Int
{
let request = NSFetchRequest<FetchableType>(entityName: entityName)
return try context.count(for: request)
}
}
在 NSManagedObject
个子类中采用 Fetchable
我有很多核心数据实体,它们都有这个方法:
class func count(_ context:NSManagedObjectContext) -> Int
假设实体被称为:汽车、公共汽车、飞机等
我想做的就是这个,就像我平时做的那样。
let carCount = Car.count(coreDataContext)
个
let busCount = Bus.count(coreDataContext)
但是,如前所述,我只有实体名称
我如何 运行 仅通过该实体的名称从该实体中获取该方法?
创建具有关联类型的协议
protocol Fetchable
{
associatedtype FetchableType: NSManagedObject = Self
static var entityName : String { get }
static func count(_ context: NSManagedObjectContext) throws -> Int
}
和协议扩展
extension Fetchable where Self : NSManagedObject
{
static var entityName : String { return String(describing:self) }
static func count(_ context: NSManagedObjectContext) throws -> Int
{
let request = NSFetchRequest<FetchableType>(entityName: entityName)
return try context.count(for: request)
}
}
在 NSManagedObject
个子类中采用 Fetchable