1. ホーム
  2. swift

[解決済み] Swiftの関数パラメータとしてのプロトコルに準拠したクラス

2023-01-28 15:58:51

質問

Objective-Cでは、あるプロトコルに準拠したクラスをメソッドの引数として指定することが可能です。例えば、あるメソッドにのみ UIViewController に準拠した UITableViewDataSource :

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

Swiftでこれを実現する方法は見当たりません(もしかしたらまだ実現できていないのかもしれません)。複数のプロトコルを指定するには func foo(obj: protocol<P1, P2>) を使って複数のプロトコルを指定できますが、オブジェクトが特定のクラスであることを同様に要求するにはどうすればよいでしょうか?

どのように解決するのですか?

以下のように foo を一般関数として定義し、型制約を使用してクラスとプロトコルの両方を要求することができます。

Swift 4

func foo<T: UIViewController & UITableViewDataSource>(vc: T) {
    .....
}

スウィフト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)
}