扩展符合NSFetchRequestResult的协议

时间:2016-07-30 20:43:03

标签: ios swift core-data protocols swift3

我正在将我的代码迁移到Swift 3,我遇到了一个我不是100%肯定的问题。

自2016年WWDC以来,Core Data团队更新了他们的框架,以便更好地使用泛型,而新增强的NSFetchRequest现在返回符合NSFetchRequestResult的对象。

因此,在下面的代码中,我的基本协议符合上述NSFetchRequestResult协议,并且在其子协议ManagedObjectFetchable的扩展中,我想返回符合类型的获取对象:

import CoreData

@objc protocol ManagedObjectType: class, NSFetchRequestResult { }

protocol ManagedObjectFetchable: ManagedObjectType { }

extension ManagedObjectFetchable {
  static func preFetch(for predicate: Predicate, sortedBy sortDescriptors: [SortDescriptor]) throws -> [Self] {
    let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)
    fetchRequest.predicate = predicate
    fetchRequest.sortDescriptors = sortDescriptors

    let dummyContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    return try dummyContext.fetch(fetchRequest)
  }
}

这里的问题是这一行:

// Error: Binary operator '<' cannot be applied to operands of type 'NSFetchRequest<_>.Type' and 'Self.Type'
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)

这有点令人困惑,因为我不认为这与二元运算符有任何关系......在我很容易得出一个Swift错误的结论之前,我想知道是否有人遇到类似的问题的问题。

我可以使用泛型来解决这个问题:

extension ManagedObjectFetchable {
  static func preFetch<T: ManagedObjectFetchable>(for predicate: Predicate, sortedBy sortDescriptors: [SortDescriptor]) throws -> [T] {
    let fetchRequest = NSFetchRequest<T>(entityName: Self.entityName)
    fetchRequest.predicate = predicate
    fetchRequest.sortDescriptors = sortDescriptors

    let dummyContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    return try dummyContext.fetch(fetchRequest)
  }
}

这就是我现在要做的事情,但我不想理解为什么这不起作用。如果有人可以帮助启发这个很棒的问题!

1 个答案:

答案 0 :(得分:1)

这是Swift中的一个错误。变化:

let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)

为:

let fetchRequest: NSFetchRequest<Self> = NSFetchRequest(entityName: Self.entityName)

并且代码应该编译。