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@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@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

Reply via email to