【问题标题】:swift 3 - pass entity as argument to functionswift 3 - 将实体作为参数传递给函数
【发布时间】:2017-03-15 07:12:55
【问题描述】:

在早期版本的swift中,我有一个核心数据函数

func retrieveItemsForRelatedEntity(entity: String, relatedEntity: String, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? {

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext!
    let frequest = NSFetchRequest(entityName: entity)
    frequest.returnsObjectsAsFaults = false

    if sortDescriptors != nil {
        frequest.sortDescriptors = sortDescriptors
    } 

    switch relatedEntity {
    case "CostCentre":
        frequest.predicate = NSPredicate(format: "costCentre.identifier == '\(identifier)'")
        return try! context.executeFetchRequest(frequest)
    case "CostCentreDay":
        frequest.predicate = NSPredicate(format: "costCentreDay.identifier == '\(identifier)'")
        return try! context.executeFetchRequest(frequest)
    case "Resource":
        frequest.predicate = NSPredicate(format: "resource.identifier == '\(identifier)'")
        return try! context.executeFetchRequest(frequest)
    case "ResourceDay":
        frequest.predicate = NSPredicate(format: "resourceDay.identifier == '\(identifier)'")
        return try! context.executeFetchRequest(frequest)
    case "CostedDay":
        frequest.predicate = NSPredicate(format: "costedDay.identifier == '\(identifier)'")
        return try! context.executeFetchRequest(frequest)
    default:
        print("wrong entity for this function")
        return nil
    }
}

在 Swift 3.0 中,“无法推断通用结果类型”,所以我可以传入实体类型,而不是传入实体标题字符串,然后为我的获取请求打开它吗?

【问题讨论】:

    标签: ios swift core-data nsfetchrequest


    【解决方案1】:

    回答你的问题

    所以我可以不传入实体标题字符串,而是传入实体类型,然后为我的获取请求打开它吗?

    是的,那将是最好的方法。类似的东西

     retrieveItemsForRelatedEntity(entity: NSManagedObject, relatedEntity: String, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? {
    

    From another question

    您必须指定泛型类型,否则方法调用不明确。

    第一个版本是为 NSManagedObject 定义的,第二个版本是为每个使用扩展名的对象自动生成的,例如:

    这个扩展是自动生成的(如下图Animal 类型。

    来自 Apple 的关于从 Swift 2 更改为 Swift 3 的文档

    NSFetchRequest 现在是基于新 NSFetchRequestResult 协议的参数化类型。

    executeFetchRequest(...) 的函数名称在 Swift 3 中也发生了变化

    public func fetch<T : NSFetchRequestResult>(_ request: NSFetchRequest<T>) throws -> [T]
    

    NSFetchRequest 更改的 Apple 文档示例

    斯威夫特 2

    func findAnimals() {
        let request = NSFetchRequest(entityName:”Animal")
        do {
            guard let searchResults = try context.executeFetchRequest(request) as? [Animal] else {
                print("Results were not of the expected structure")
            }
            ... use(searchResults) ...
        } catch {
        print("Error ocurred during execution: \(error)")
    }
    

    }

    斯威夫特 3

    func findAnimals() {
        let request: NSFetchRequest<Animal> = Animal.fetchRequest
        do {
            let searchResults = try context.fetch(request)
            ... use(searchResults) ...
        } catch {
            print("Error with request: \(error)")
        }
    }
    

    因此在 Swift 2 中转换您的代码以创建 NSFetchRequest

    let frequest = NSFetchRequest(entityName: entity)
    

    到 Swift 3

    let frequest: NSFetchRequest<YourEntityType> = YourEntityType.fetchRequest()
    

    context.executeFetchRequest(frequest)
    

    将会

    context.fetch(frequest)
    

    注意:从网络上的其他示例来看,Animal.fetchRequest 的 Apple 文档代码示例可能是错误的,而应该是 Animal.fetchRequest()

    【讨论】:

      【解决方案2】:

      请试试这个。它帮助了我。

      func retrieveItemsForRelatedEntity(entity: String, relatedEntity: NSEntityDescription, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? {
      
          let appDelegate = UIApplication.shared.delegate as! AppDelegate
          let context: NSManagedObjectContext = appDelegate.persistentContainer.viewContext
      
          let frequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity) 
      

      switch relatedEntity {
          case NSEntityDescription.entity(forEntityName: "CostCentre", in: context)!:
      

      【讨论】:

        【解决方案3】:

        试试这个:

        let frequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
        

        【讨论】:

        • 我最终意识到我根本不需要传递实体描述。不幸的是,问题标题可能会误导其他人。
        猜你喜欢
        • 2013-01-27
        • 1970-01-01
        • 2015-07-25
        • 2021-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-12
        • 1970-01-01
        相关资源
        最近更新 更多