Hi again, You might want to look at Self requirement in protocols for exemple: protocol P { func items(/*...*/) -> [Self] } class C: P { func items(/*...*/) -> [C] { ... } }
However it might not always work as you expect. I can't say which is the better. Using associated type might be more flexible. Pierre > Le 5 janv. 2017 à 21:10, davel...@mac.com a écrit : > > 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