在Objective-C常用id<**Delegate>来应用一些定义的代理协议类,在业务逻辑处理的类中采用注册类([XXHandler class])的方式做为一个处理器类的实例引用,如下:
- (void)registeConfigurationClass:(__unsafe_unretained Class)className
{
self.configuration = [[className alloc] init];
}
但在Swift如果用AnyClass来实例化对象则需转为指定类的Type,才能进行实例化,如下:
let anyClass: AnyClass = xxx
let viewControllerClass: UIViewController.Type = anyClass as UIViewController.Type
let viewController = viewControllerClass()
故而通过以上途径是否不能解决?还好我们有泛型函数,定义了一个名为regsiterClass的泛型函数,来注册一个处理器类:
protocol WDHandleProtocol {
func generateSomething() -> String
}
class WDResponder: NSObject {
var handler: WDHandleProtocol?
func regsiterClass<T: WDHandleProtocol>(handler: T) -> Void {
self.handler = handler
}
}
参数:handler参数是类型T,T是一个占位类型参数,必需遵循WDHandleProtocol协议。
这个函数的类型参数列紧随在两个类型参数需求的后面:
这样能够使regsiterClass函数能切换注册的处理器,还可注册多个处理器,这个看具体的业务场景,即便他们是不同的处理器,只需改变regsiterClass函数实现中对处理器的引用方式即可。
网友评论