簡體   English   中英

擴展符合NSFetchRequestResult的協議

[英]Extending Protocols conforming to NSFetchRequestResult

我正在將我的代碼遷移到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)
  }
}

這就是我現在要做的事情,但我不喜歡不理解為什么這不起作用。 如果有人可以幫助啟發這個問題,這將是非常棒的!

這是Swift中的一個錯誤。 更改:

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

至:

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

並且代碼應該編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM