gpt4 book ai didi

ios - 将请求函数转换为通用类型

转载 作者:行者123 更新时间:2023-11-29 11:41:56 25 4
gpt4 key购买 nike

我正在尝试将我的以下获取请求代码从核心数据转换为通用类型。

let request = NSPredicate(format: "name == %@ AND password == %@ AND type == %@", "admin", "admin", "admin")
let fetchReq : NSFetchRequest = UserRegistration.fetchRequest()
fetchReq.predicate = request
let adminDetail :[UserRegistration] = DatabaseEngine.fetch(fetchRequest: fetchReq)!

到目前为止已转换:

extension UIViewController{
class func getData<T: NSManagedObject>(req: NSPredicate) -> T{
let fetchReq : NSFetchRequest = T.fetchRequest()
fetchReq.predicate = req
return DatabaseEngine.fetch(fetchRequest: fetchReq as! NSFetchRequest<NSManagedObject>)! as! T

}
}

DatabaseEngine.fetch 函数。

static func fetch (fetchRequest: NSFetchRequest<T> = NSFetchRequest(), context:NSManagedObjectContext = kApplicationDelegate.managedObjectContext) -> [T]? {

let entity = NSEntityDescription.entity(forEntityName: typeName(some:T.self)
, in:context)
// Configure Fetch Request
fetchRequest.entity = entity
do {
return try context.fetch(fetchRequest as! NSFetchRequest<NSFetchRequestResult>) as? [T]
} catch {

//let fetchError = error as NSError
// return nil

}
return nil
}

但是没有结果了。任何人都可以用几行解释帮助我转换此代码。 Ans 将不胜感激。

最佳答案

根据我的评论,我建议使用带有扩展名的协议(protocol)

protocol Fetchable
{
associatedtype FetchableType: NSManagedObject = Self

static var entityName : String { get }
static var managedObjectContext : NSManagedObjectContext { get }
static func objects(for predicate: NSPredicate?) throws -> [FetchableType]
}

extension Fetchable where Self : NSManagedObject
{
static var entityName : String {
return String(describing: self)
}

static var managedObjectContext : NSManagedObjectContext {
return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
}

static func objects(for predicate: NSPredicate?) throws -> [FetchableType]
{
let request = NSFetchRequest<FetchableType>(entityName: entityName)
request.predicate = predicate
return try managedObjectContext.fetch(request)
}
}

(UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 更改为对托管对象上下文的引用。

使所有NSManagedObject子类都采用Fetchable。子类中不需要额外的代码。

现在你可以获取数据了

do {
let predicate = NSPredicate(format: ...
let objects = try MyEntity.objects(for: predicate)
} catch {
print(error)
}

就是这样,对象[MyEntity],没有任何类型转换,成功时始终是非可选的。

该协议(protocol)很容易通过默认的排序描述符、排序方向等进行扩展。

关于ios - 将请求函数转换为通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46037860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com