> On Jan 9, 2017, at 11:59 PM, Pierre Monod-Broca via swift-users > <swift-users@swift.org> wrote: > > 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] { > ... > } > }
FWIW, this requires that ‘C’ is final. Otherwise, a subclass ‘D’ of ‘C’ won’t satisfy the requirement, because C.items() still returns a ‘C’ and not a ‘D’. > > 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 _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users