Avatar
おけ、大体まとまった。 @hiragram ひらりのやりたいことはTableViewに生えているCell&Protocolを満たす関数を連続で呼び出したい、ということ。 extension UITableView { func register<Cell>(_ type: Cell.Type) where Cell: UITableViewCell, Cell: SomeProtocol { ... } } このregister関数は事実上UITableviewとCell.Typeの二引数関数なので、Cellから見れば自身のパラメータを埋めてあげればUITableViewだけの一引数関数を準備できる。 extension SomeProtocol where Self: UITableViewCell { static func register(to tableView: UITableView) { tableView.register(self) } } こうすると、Cell.registerが全て(UITableView) -> ()の型になるので、それを配列で処理する関数をUITableView側に準備してあげれば、 extension UITableView { func registerAll(_ registers: [(UITableView) -> ()]) { registers.forEach { $0(self) } } } 使う側もスッと書けるようになりました。 tableView.registerAll([MyCell1.register, MyCell2.register, MyCell3.register]) (UITableView) -> ()の型でabuseが気になるなら、これを一枚ラップして全部隠せば大丈夫ですね。 (edited)