swift - 如何为 NSFetchRequest 转换 T.Type?

标签 swift generics core-data

我有一个方法签名:func fetch<T>(_ model: T.Type, predicate: NSPredicate?, sorted: Sorted?, completion: (([T]) -> Void)) where T: Storable我想使用 model在 NSFetchRequest 中。

在这种情况下,extension NSManagedObject: Storable {}使用 Storable协议(protocol)内部有一些基本的CRUD方法定义。

我已经尝试过:

  • 类型转换TNSManagedObject ,但这会导致运算符优先级错误。 (T as! NSManagedObject)因此不起作用。

  • 仅使用 NSFetchRequest<T>()但编译器告诉我 T does not conform to NSFetchRequestResult .

  • where T: Storable, NSManagedObject但这意味着必须更新我的协议(protocol)以获得实现细节,而我不想去那里。

  • (model as! NSManagedObject).fetchRequest()但是Cast from 'T.Type' to unrelated type 'NSManagedObject' always fails

我想要实现的基本上是:我希望能够 fetch(User.self, ...)如果可能的话,使用该方法的当前签名。

最佳答案

答案是将 T.Type 转换为 NSManagedObject.Type 以获得该类型,然后调用 .fetchRequest()那个。

func fetch<T: Storable>(_ model: T.Type, predicate: NSPredicate?, sorted: Sorted?, completion: (([T]) -> Void)) {
    guard let managedObjectType = model as? NSManagedObject.Type else {
        return
    }

    let fetchRequest = managedObjectType.fetchRequest()
    fetchRequest.predicate = predicate
    ...
}

关于swift - 如何为 NSFetchRequest 转换 T.Type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55619039/

相关文章:

ios - 很少有与故障相关的核心数据崩溃

ios - 使用 Swift 更新实体记录而不是使用 CoreData 创建新记录

ios - 如何创建委托(delegate)以在单击另一个 View Controller 的按钮时更改一个 View Controller 中的标签名称

ios - 如何限制API调用次数?

objective-c - 阐明 NSLayoutManager 和 NSTextContainer 在垂直布局方面的行为?

java - 什么可能是 ParameterizedType 的实例?

IOS:如何为扫描的条码拍照?

ios - 可以采用元素数组或单个元素的 Swift 泛型类

c# - 对泛型类型的构造函数约束或只是检查我的泛型类型构造函数中的约束?

ios - TableView 自动重新排序