【问题标题】:Create a generic Swift function to return an array of Core Data entities创建一个通用 Swift 函数以返回一个 Core Data 实体数组
【发布时间】:2017-03-11 17:02:53
【问题描述】:

警告:我对 Swift 和 Core Data 还是很陌生

我的代码中有几个函数返回特定实体类型的数组:

func fetchStores() -> [Store]? {
  var stores: [Store]?
  let fetchRequest: NSFetchRequest<Store> = Store.fetchRequest()

  do {
    stores = try ad.persistentContainer.viewContext.fetch(fetchRequest)
  } catch {
    assert(false, error.localizedDescription)
  }

  return stores
}

我想创建一个通用函数来处理我的所有实体:

func fetchEntities<T: NSManagedObject>(entity: T) -> [T]? {
  var results: [T]?

  if let fetchRequest: NSFetchRequest<T> = T.fetchRequest() as? NSFetchRequest<T> {
    do {
      results = try ad.persistentContainer.viewContext.fetch(fetchRequest)
    } catch  {
      assert(false, error.localizedDescription)
    }
  } else {
    assert(false,"Error: cast to NSFetchRequest<T> failed")
  }

  return results
}

// Usage:
let store = Store()
let stores = fetchEntities(entity: store)

有没有办法让我做到这一点不必创建Store 实例?

TIA

【问题讨论】:

标签: swift generics core-data


【解决方案1】:

你快到了。您只需要更改参数 从T 输入到T.Type

func fetchEntities<T: NSManagedObject>(entity: T.Type) -> [T]?

这样你就可以传递一个类型而不是一个实例:

let stores = fetchEntities(entity: Store.self)

【讨论】:

  • 非常感谢@Martin R!
【解决方案2】:

我遇到了完全相同的问题,甚至 Martin 的回答对我也不起作用。我最终解决的方法是使用:

let entityName = String(describing: T.self)
let fetchRequest: NSFetchRequest<T> = NSFetchRequest(entityName: entityName)

而不是 iOS 10 的类函数,它工作得非常好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2021-01-21
    • 2015-05-28
    • 2019-05-17
    • 2012-09-26
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多