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
,这就是您的 handler
的 dynamicType
将 return 的类型(未分配时似乎回退到静态类型)。
另一方面,您的 controller
的动态类型确实是 Test.ViewController
,因为这是您传入的实例的 dynamicType
。
至于解决方案,在不知道您要在这里实现什么的情况下,很难说。
我有一个方法:
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
,这就是您的 handler
的 dynamicType
将 return 的类型(未分配时似乎回退到静态类型)。
另一方面,您的 controller
的动态类型确实是 Test.ViewController
,因为这是您传入的实例的 dynamicType
。
至于解决方案,在不知道您要在这里实现什么的情况下,很难说。