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 <[email protected]>
> 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 <[email protected]> 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
>> [email protected]
>> https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users