swift - 创建默认获取请求的通用方法
问题描述
我发现每次都复制查询类型非常乏味。例如:
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>'
解决方案
我认为您会追求类似这样的东西,因此它会从用于创建获取请求的类中生成实体名称。
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()
推荐阅读
- python - 如何使用恒定的查找时间创建间隔到数字的映射?(如果这是可能的?)
- c# - 函数中的绝对数之和
- amazon-web-services - 使用 terraform 和 bitbucket 管道访问 S3
- android - 如何检查用户是第一次在谷歌登录android
- css - Ant Design中具有多种图像大小的轮播
- python - 从基本矩阵估计两个未校准相机之间的相对旋转
- neo4j - Neo4j 中的模式匹配
- .net - dotnet 测试无法找到友好名称“代码覆盖率”的数据收集器
- python-3.x - 在数据框中查找 word2vec 结果的索引
- go - 是否可以从 go 调用 JS websql