[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