【发布时间】:2018-04-23 15:24:32
【问题描述】:
这是我的第一个Swift 项目,也是CoreData。 Swift 不像 Objective C 中的 return instancetype。
在Swift - CoreData 类中,我使用NSManagedObject 的通用基类。在那里我实现了一个class 函数。
class func FRCWith(sortArray: [NSSortDescriptor], predicate: NSPredicate? = nil, mainContext: NSManagedObjectContext = CoreDataManager.shared.managedObjectContext) -> NSFetchedResultsController<NSManagedObject> {
let className = self.nameOfTheClass
let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest.init(entityName: className)
fetchRequest.sortDescriptors = sortArray
fetchRequest.fetchBatchSize = 4
if let predicateValue = predicate {
fetchRequest.predicate = predicateValue
}
let fetchedResultsController: NSFetchedResultsController<NSManagedObject> = NSFetchedResultsController.init(fetchRequest: fetchRequest, managedObjectContext: mainContext, sectionNameKeyPath: nil, cacheName: nil)
do {
try fetchedResultsController.performFetch()
} catch {
print(error.localizedDescription)
}
return fetchedResultsController
}
我想返回NSFetchedResultsController<customCoreDataClass> 而不是普通的NSFetchedResultsController<NSManagedObject>。
var schoolvalue: NSFetchedResultsController<SchoolDetails> = SchoolDetails.FRCWith([sort])
var schoolvalue: NSFetchedResultsController<StudentDetails> = StudentDetails.FRCWith([sort], preidcate)
现在我像这样在for loop 中使用并检查FRC as! customClass
let loopValue: SchoolDetails = someFRC.object(at: IndexPath.init(row: value, section: 0)) as! SchoolDetails
找到某种solution in StackOverflow。 T那个东西,我不明白。
这样的方法有可能吗?
谢谢@Paulw11 的回答。
初始化时应用随机崩溃
let fetchedResultsController: NSFetchedResultsController<T> = NSFetchedResultsController<T>(fetchRequest: fetchRequest, managedObjectContext: mainContext, sectionNameKeyPath: nil, cacheName: nil)
let fetchRequest:NSFetchRequest<T> = T.fetchRequest() as! NSFetchRequest<T>\\ line return nil. There is no crash below iOS 10.x.
仅在从 App Store 或 Testflight 下载时发生。
【问题讨论】:
-
那个 T 东西是 Swift 泛型。它们在 Apple 的 Swift 书中有所描述。当你说
NSFetchedResultsController<StudentDetails>时,你已经在使用泛型了 -
感谢@Paulw11 提供的信息。在另一个答案中
func fetchObjects<T:NSManagedObject where T:NamedManagedObject>(entity:T.Type, predicate:NSPredicate? = nil, sortDescriptors:NSSortDescriptor[]? = nil) -> T[]?有没有办法将这个NamedManagedObject静态类作为动态类来克服?
标签: ios core-data nsfetchedresultscontroller nsfetchrequest base-class