[swift-users] make a static/class method return type be the subclass it is called with

davelist at mac.com davelist at mac.com
Thu Jan 5 14:10:15 CST 2017


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 <pierremonodbroca at 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 at 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 at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users



More information about the swift-users mailing list