我有一个方法:
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,所以如果有人遇到这样的问题和/或有解决方案,请告诉我。
提前谢谢。
答案 0 :(得分:0)
这是因为controller
的静态和动态类型不同。
静态类型取自ControllerType
类型,您已将其定义为UIViewController
。动态类型与visibleController
指向的实例的类型相同 - 在本例中为Test.ViewController
。
因为泛型是从传递给函数的静态类型推断出来的(它们的特化在编译时发生),所以Controller
将被推断为UIViewController
。因此,您的类型名称将为UIViewController -> UIViewController
,并且dynamicType
的{{1}}将返回(当未分配时,它似乎会回退到静态类型)。
另一方面,handler
的动态类型确实为controller
,因为它是您传入的实例的Test.ViewController
。
至于解决方案,如果不确切知道你在这里想要达到的目标,很难说。