在Objective- C中,可以将符合协议的类指定为方法参数。例如,我可以有一个只允许UIViewController符合的方法UITableViewDataSource:
UIViewController
UITableViewDataSource
- (void)foo:(UIViewController<UITableViewDataSource> *)vc;
我找不到在Swift中执行此操作的方法(也许尚不可能)。您可以使用来指定多种协议func foo(obj: protocol<P1, P2>),但是您又如何要求该对象属于特定类呢?
func foo(obj: protocol<P1, P2>)
您可以将其定义foo为通用函数,并使用类型约束来同时要求类和协议。
foo
斯威夫特4
func foo<T: UIViewController & UITableViewDataSource>(vc: T) { ..... }
Swift 3 (也适用于Swift 4)
func foo<T: UIViewController>(vc:T) where T:UITableViewDataSource { .... }
迅捷2
func foo<T: UIViewController where T: UITableViewDataSource>(vc: T) { // access UIViewController property let view = vc.view // call UITableViewDataSource method let sections = vc.numberOfSectionsInTableView?(tableView) }