public protocol DataSource: class { associatedtype AbstractType func source() -> AbstractType } class ViewController: UIViewController { weak var dataSouce: T? typealias AbstractType = T.AbstractType override func viewDidLoad() { super.viewDidLoad() let source: AbstractType? = dataSouce?.source() print("Source: ", source) } } @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, DataSource { var vc: ViewController? var window: UIWindow? typealias AbstractType = Date func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. vc = ViewController() vc?.dataSouce = self window = UIWindow(frame: UIScreen.main.bounds) window?.rootViewController = vc window?.makeKeyAndVisible() return true } // MARK: - DataSource func source() -> AbstractType { return Date() } }