Swift 泛型在类型别名中被视为父级

Swift Generic is treated as a parent in typealias

我有一个方法:

public func someMethod<Controller>(controller: Controller) {
    print(controller)

    typealias HandlerType = Controller -> UIViewController
    let handler: HandlerType

    print(handler.dynamicType)
}

用 UIViewController 的子实例调用它后,在我的例子中是 ViewController,它打印:

<Test.ViewController: 0x7fc43be479d0>
UIViewController -> UIViewController

我的目标是拥有这样的类型别名:

Test.ViewController -> UIViewController

我有 typealias 和声明的 valriable:

public typealias ControllerType = UIViewController 
public private(set) static var visibleController: ControllerType?

方法调用是:

if let controller = visibleController { 
    someMethod(controller) 
}

我不明白为什么 ViewController 在 typealias 中变成了 UIViewController,所以如果有人遇到这种问题,and/or 有解决方案,请告诉我。

提前致谢。

这是因为您 controller 的静态和动态类型不同。

静态类型取自您的 ControllerType 类型别名,您已将其定义为 UIViewController。动态类型与 visibleController 指向的实例类型相同——在本例中为 Test.ViewController.

因为泛型是从您传递给函数的静态类型推断出来的(它们的特化发生在编译时),所以 Controller 将被推断为 UIViewController。因此,您的类型别名将是 UIViewController -> UIViewController,这就是您的 handlerdynamicType 将 return 的类型(未分配时似乎回退到静态类型)。

另一方面,您的 controller 的动态类型确实是 Test.ViewController,因为这是您传入的实例的 dynamicType

至于解决方案,在不知道您要在这里实现什么的情况下,很难说。