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?
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?
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:
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@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?
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, davelist@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:
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@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?
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’.
···
On Jan 9, 2017, at 11:59 PM, Pierre Monod-Broca via swift-users <swift-users@swift.org> wrote:
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, davelist@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:
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@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?
On Jan 10, 2017, at 3:05 AM, Slava Pestov <spestov@apple.com> wrote:
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, davelist@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:
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@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?