一尘不染

在Swift中将符合协议的类作为函数参数

swift

在Objective-
C中,可以将符合协议的类指定为方法参数。例如,我可以有一个只允许UIViewController符合的方法UITableViewDataSource

- (void)foo:(UIViewController<UITableViewDataSource> *)vc;

我找不到在Swift中执行此操作的方法(也许尚不可能)。您可以使用来指定多种协议func foo(obj: protocol<P1, P2>),但是您又如何要求该对象属于特定类呢?


阅读 273

收藏
2020-07-07

共1个答案

一尘不染

您可以将其定义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)
}
2020-07-07