Swift3:将参数传递到NSFetchRequest方法

Swift3:将参数传递到NSFetchRequest方法,swift3,nsfetchrequest,Swift3,Nsfetchrequest,我在项目中使用了一种通用的CoreData查询方法 func query(table: String, searchPredicate: NSPredicate) -> [AnyObject] { let context = app.managedObjectContext let fetchRequest = NSFetchRequest(entityName: table) fetchRequest.predicate = searchPredicate

我在项目中使用了一种通用的CoreData查询方法

func query(table: String, searchPredicate: NSPredicate) -> [AnyObject]
{
    let context = app.managedObjectContext

    let fetchRequest = NSFetchRequest(entityName: table)

    fetchRequest.predicate = searchPredicate

    let results = try! context.fetch(fetchRequest)
    return results
}
在Swift 3中,这不起作用。我在苹果的网站上找到了这个:

func findAnimals() 
{
    let request: NSFetchRequest<Animal> = Animal.fetchRequest
    do 
    {
        let searchResults = try context.fetch(request)
        ... use(searchResults) ...
    } 
    catch 
    {
        print("Error with request: \(error)")
    }
}
func findAnimals()
{
let请求:NSFetchRequest=Animal.fetchRequest
做
{
让searchResults=try context.fetch(请求)
…使用(搜索结果)。。。
} 
抓住
{
打印(“请求错误:\(错误)”)
}
}

使用Apple示例,我如何将Animal作为参数传递给该方法,以使FindAnimal更通用?

我没有尝试过这种方法,但我认为类似的方法会起作用

func findCoreDataObjects<T: NSManagedObject>() -> [T] {
    let request = T.fetchRequest
    do 
    {
        let searchResults = try context.fetch(request)
        ... use(searchResults) ...
    } 
    catch 
    {
        print("Error with request: \(error)")
    }
}
func findCoreDataObjects()->[T]{
let request=T.fetchRequest
做
{
让searchResults=try context.fetch(请求)
…使用(搜索结果)。。。
} 
抓住
{
打印(“请求错误:\(错误)”)
}
}
您必须使整个函数通用,因此在调用它时必须告诉它T是什么类型

someObject.findCoreDataObjects<Animal>()
someObject.findCoreDataObjects()
我认为那应该做这项工作。虽然不完全确定,因为我自己是泛型新手:D

这个怎么样

func query<T: NSManagedObject>(table: String, searchPredicate: NSPredicate) -> [T] {
    let context = app.managedObjectContext
    let fetchRequest: NSFetchRequest<T> = NSFetchRequest(entityName: table)
    fetchRequest.predicate = searchPredicate
    let results = try! context.fetch(fetchRequest)
    return results
}
func查询(表:字符串,搜索谓词:NSPredicate)->[T]{
让context=app.managedObjectContext
let fetchRequest:NSFetchRequest=NSFetchRequest(entityName:table)
fetchRequest.predicate=searchPredicate
let results=try!context.fetch(fetchRequest)
返回结果
}

以下是可能对某人有所帮助的最终结果:

import Foundation
import Cocoa

func addRecord<T: NSManagedObject>(_ type : T.Type) -> T
{
    let entityName = T.description()
    let context = app.managedObjectContext
    let entity = NSEntityDescription.entity(forEntityName: entityName, in: context)
    let record = T(entity: entity!, insertInto: context)
    return record
}

func recordsInTable<T: NSManagedObject>(_ type : T.Type) -> Int
{
    let recs = allRecords(T.self)
    return recs.count
}


func allRecords<T: NSManagedObject>(_ type : T.Type, sort: NSSortDescriptor? = nil) -> [T]
{
    let context = app.managedObjectContext
    let request = T.fetchRequest()
    do
    {
        let results = try context.fetch(request)
        return results as! [T]
    }
    catch
    {
        print("Error with request: \(error)")
        return []
    }
}

func query<T: NSManagedObject>(_ type : T.Type, search: NSPredicate?, sort: NSSortDescriptor? = nil, multiSort: [NSSortDescriptor]? = nil) -> [T]
{
    let context = app.managedObjectContext
    let request = T.fetchRequest()
    if let predicate = search
    {
        request.predicate = predicate
    }
    if let sortDescriptors = multiSort
    {
        request.sortDescriptors = sortDescriptors
    }
    else if let sortDescriptor = sort
    {
        request.sortDescriptors = [sortDescriptor]
    }

    do
    {
        let results = try context.fetch(request)
        return results as! [T]
    }
    catch
    {
        print("Error with request: \(error)")
        return []
    }

}


func deleteRecord(_ object: NSManagedObject)
{
    let context = app.managedObjectContext
    context.delete(object)
}

func deleteRecords<T: NSManagedObject>(_ type : T.Type, search: NSPredicate? = nil)
{
    let context = app.managedObjectContext

    let results = query(T.self, search: search)
    for record in results
    {
        context.delete(record)
    }
}

func saveDatabase()
{
    let context = app.managedObjectContext

    do
    {
        try context.save()
    }
    catch
    {
        print("Error saving database: \(error)")
    }
}

我在我的项目中使用这种方式:

static func retrieveRecords<T: NSManagedObject>(table: String, sortDescriptorKey: NSSortDescriptor? = nil) -> [T] {
    do {
        let fetchRequest: NSFetchRequest<T> = NSFetchRequest(entityName: table)
        fetchRequest.sortDescriptors = [sortDescriptorKey!]
        let results = try context.fetch(fetchRequest)
        print("\(results)")
        return results
    } catch let error {
        print("Could not fetch \(error.localizedDescription)")

        return []
    }
}

我们曾尝试将其用于func allRecords(table:String,sort:NSSortDescriptor?=nil)->[T]{返回查询(table:table,search:nil,sort:sort)}等等什么?你因为抄袭我的答案而得到赏金?这有什么意义?Lol@Fogmeister-我不得不仔细考虑谁得到了赏金,因为答案很相似。我可以复制并粘贴closetCoder的答案到我的代码中,这就是提示它的原因。不过谢谢你的帮助。很高兴你发现它很有用。事实上,如果我在发布悬赏后有机会花更多的时间在这上面,我会意识到这其实一直都是正确的答案。
static func retrieveRecords<T: NSManagedObject>(table: String, sortDescriptorKey: NSSortDescriptor? = nil) -> [T] {
    do {
        let fetchRequest: NSFetchRequest<T> = NSFetchRequest(entityName: table)
        fetchRequest.sortDescriptors = [sortDescriptorKey!]
        let results = try context.fetch(fetchRequest)
        print("\(results)")
        return results
    } catch let error {
        print("Could not fetch \(error.localizedDescription)")

        return []
    }
}
personen = retrieveRecords(table: "Person", sortDescriptorKey: NSSortDescriptor(key: #keyPath(Person.nachname), ascending: true, selector: #selector(NSString.localizedCompare)))