Yes, it does seem to work. I just wondered if there was a better way to do it. Perhaps by writing the method in a base class (but I couldn't get that to work) instead of using an extension. Then I could just inherit from that base class rather than needing to write:
extension Event: DDRCoreData { typealias Entity = Event } in addition to class Event: NSManagedObject . . . Yes, I know in Xcode 8, that last part can now be written for you. Again, if this is the "right way to do it", I'm ok with that, I just wondered if there is a better way to do it. Thanks, Dave Reed > On Jan 5, 2017, at 2:35 PM, Pierre Monod-Broca <pierremonodbr...@gmail.com> > wrote: > > Hello, > > It looks that you have what you wanted because Event.Entity is an alias of > Event. > > Pierre > >> Le 5 janv. 2017 à 16:47, Dave Reed via swift-users <swift-users@swift.org> a >> écrit : >> >> Is there a way to make a static or class method specify the return type be >> the actual class it is called with? >> >> The example code below using protocols/extensions mostly works (the type is >> [Event.Entity] not [Event] but it seems to work. >> >> If I try to make DDRCoreData a base class and Event subclass it, I'm only >> able to get the return type to be [DDRCoreData], not [Event] when I call it >> with Event.items(in: moc) >> >> Here is the code that mostly works using protocols. Is there a better way to >> do this? >> >> protocol DDRCoreData { >> associatedtype Entity: NSManagedObject >> >> static func items(in context: NSManagedObjectContext, matching predicate: >> NSPredicate?, sortedBy sorters: [NSSortDescriptor]?) -> [Entity] >> } >> >> extension DDRCoreData { >> static func items(in context: NSManagedObjectContext, matching predicate: >> NSPredicate? = nil, sortedBy sorters: [NSSortDescriptor]? = nil) -> [Entity] >> { >> var items: [Entity] = [] >> context.performAndWait { >> let fetchRequest: NSFetchRequest<Entity> = Entity.fetchRequest() >> as! NSFetchRequest<Entity> >> fetchRequest.predicate = predicate >> fetchRequest.sortDescriptors = sorters >> do { >> items = try fetchRequest.execute() as [Entity] >> } catch { >> >> } >> } >> return items >> } >> } >> >> @objc(Event) >> public class Event: NSManagedObject { >> >> } >> >> extension Event: DDRCoreData { >> typealias Entity = Event >> } >> >> // compiler says items is of type [Event.Entity] >> let items = Event.items(in: controller.managedObjectContext!) >> >> Thanks, >> Dave Reed >> >> >> _______________________________________________ >> swift-users mailing list >> swift-users@swift.org >> https://lists.swift.org/mailman/listinfo/swift-users _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users