Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
class TableView {
weak var dataSource: TableViewDataSource?
}
class TableViewCell { }
protocol TableViewTitlesDataSource: class {
func tableView(tableView: TableView, titleForHeaderInSection section: Int) -> String?
func tableView(tableView: TableView, titleForFooterInSection section: Int) -> String?
}
protocol TableViewReorderingDataSource: class {
func tableView(tableView: TableView, canMoveRowAtIndexPath indexPath: IndexPath) -> Bool
func tableView(tableView: TableView, moveRowAtIndexPath sourceIndexPath: IndexPath, toIndexPath destinationIndexPath: IndexPath)
}
protocol TableViewDataSource: class {
func numberOfSections(in tableView: UITableView) -> Int
func tableView(tableView: TableView, numberOfRowsInSection section: Int) -> Int
func tableView(tableView: TableView, cellForRowAtIndexPath indexPath: IndexPath) -> TableViewCell
var titles: TableViewTitlesDataSource? { get }
var reordering: TableViewReorderingDataSource? { get }
}
// This provides auto opt-out by default
extension TableViewDataSource {
var titles: TableViewTitlesDataSource? { return nil }
var reordering: TableViewReorderingDataSource? { return nil }
}
// This provides auto opt-in when the `TableViewDataSource` is also a `TableViewTitlesDataSource`
extension TableViewDataSource where Self: TableViewTitlesDataSource {
var titles: TableViewTitlesDataSource? { return self }
}
// This provides auto opt-in when the `TableViewDataSource` is also a `TableViewReorderingDataSource`
extension TableViewDataSource where Self: TableViewReorderingDataSource {
var reordering: TableViewReorderingDataSource? { return self }
}
// Example of auto opt-in to `TableViewTitlesDataSource`
// (notice the `title` property isn't required as it's supplied by the conditional extension)
class MyDataSource: TableViewDataSource, TableViewTitlesDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 0
}
func tableView(tableView: TableView, numberOfRowsInSection section: Int) -> Int {
return 0
}
func tableView(tableView: TableView, cellForRowAtIndexPath indexPath: IndexPath) -> TableViewCell {
return TableViewCell()
}
func tableView(tableView: TableView, titleForHeaderInSection section: Int) -> String? {
return nil
}
func tableView(tableView: TableView, titleForFooterInSection section: Int) -> String? {
return nil
}
}
let x = MyDataSource()
x.titles // not nil
x.reordering // nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.