Swift Generic被视为typealias中的父级

时间:2016-06-03 15:22:02

标签: swift generics type-alias

我有一个方法:

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,所以如果有人遇到这样的问题和/或有解决方案,请告诉我。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

因为泛型是从传递给函数的静态类型推断出来的(它们的特化在编译时发生),所以Controller将被推断为UIViewController。因此,您的类型名称将为UIViewController -> UIViewController,并且dynamicType的{​​{1}}将返回(当未分配时,它似乎会回退到静态类型)。

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

至于解决方案,如果不确切知道你在这里想要达到的目标,很难说。