[swift-users] Specifying A Dynamic Type In Swift Generics
Kenny Leung
kenny_leung at pobox.com
Tue Jul 5 14:15:24 CDT 2016
So, restating the question:
You want to have a method on a class such that it will return an object which is genericised with that class. Like:
class A {
func createB() -> B<Self> {
}
}
So that if you have C which is a subclass of A, calling createB() would return B<C>, and not B<A>
Is that correct?
-Kenny
> On Jul 5, 2016, at 8:40 AM, Jon Akhtar via swift-users <swift-users at swift.org> wrote:
>
> I have a generic class that I would like to use. I¹ll include the whole
> source.
>
> public final class EventRegistration<E: AppEvent> {
> private(set) var event: E?
> private var token: AnyObject?
>
> public init() {}
>
> public init(event: AppEvent, token: AnyObject) {
> self.event = event
> self.token = token
> }
>
> public func unregister() {
> if let token = self.token,
> let event = self.event {
> event.unregister(token)
> }
> token = nil
> event = nil
> }
>
> public var isRegistered: Bool {
> return token != nil
> }
>
> deinit {
> unregister()
> }
> }
>
>
>
> I would like to use this class in my AppEvent class. Among other things
> AppEvent has a method register()
>
> public class AppEvent : CustomStringConvertible {
>
>
> Š
>
> public func register(notification: (NSNotification! ->
> Void))->EventRegistration<???> {
> let eventName = self.dynamicType.eventName()
>
> let token =
> NSNotificationCenter.defaultCenter().addObserverForName(eventName, object:
> nil, queue: self.dynamicType.eventQueue(), usingBlock: notification)
>
> let registration = EventRegistration(event: self, token: token)
>
> return registration
> }
>
>
> I have 50-100 subclasses of AppEvent that I use directly.
>
> public class SomeEvent: AppEvent {}
> public class SomeOtherEvent: AppEvent {}
> public class EvenSomeOtherEvent: AppEvent {}
>
> They all inherit the register() function.
>
> I would like the following.
>
> Let some = SomeEvent().register() { note in }
>
> some.event.self should be ³SomeEvent²
>
> Because SomeEvent.register() returns EventRegistration<SomeEvent>
>
> All the parts are there for this to be statically typed. If I implemented
> register in each class I could get the behavior I want. What I am looking
> for is a way to say ³the current dynamic type², sort of like ³Self².
>
> Is there a signature for "public func register(notification:
> (NSNotification! -> Void))->EventRegistration<???>" that would accomplish
> this, or does this break some type rule I am not aware of, or is it just a
> missing language feature.
>
> If you want points, see:
> http://stackoverflow.com/questions/38193012/specifying-a-dynamic-type-in-sw
> ift-generics
>
> Thanks,
>
> Jon
>
>
>
>
> _______________________________________________
> 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