首页 > 解决方案 > 创建默认获取请求的通用方法

问题描述

我发现每次都复制查询类型非常乏味。例如:

let request: NSFetchRequest<Animal> = Animal.fetchRequest()

是否可以创建一个返回默认请求的通用方法?像这样的东西:

let request = Animal.defaultFetchRequest() // request is NSFetchRequest<Animal>

我试着写这个:

protocol DefaultFetchable {
   associatedtype FetchableType: NSManagedObject = Self
   
   static func defaultFetchRequest() -> NSFetchRequest<FetchableType>
}

extension DefaultFetchable where Self: NSManagedObject {
   static func defaultFetchRequest() -> NSFetchRequest<FetchableType> {
      let request: NSFetchRequest<FetchableType> = FetchableType.fetchRequest()
      return request
   }
}

但我得到一个构建错误:Cannot assign value of type 'NSFetchRequest<NSFetchRequestResult>' to type 'NSFetchRequest<Self.FetchableType>'

标签: swiftcore-data

解决方案


我认为您会追求类似这样的东西,因此它会从用于创建获取请求的类中生成实体名称。

protocol DefaultFetchable {
    associatedtype FetchableType: NSManagedObject = Self
    
    static var entityName: String { get }
    static func defaultFetchRequest() -> NSFetchRequest<FetchableType>
}

extension DefaultFetchable where Self: NSManagedObject, FetchableType == Self {
    
    static var entityName: String {
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }
    
    static func defaultFetchRequest() -> NSFetchRequest<FetchableType> {
        return NSFetchRequest<FetchableType>(entityName: entityName)
    }
    
}

然后你的Animal类提供它是一个NSManagedObject符合的DefaultFetchable应该能够像这样创建获取请求:

let fetchRequest = Animal.defaultFetchRequest()

推荐阅读