Reusability in Swift, SimpleDataSource use-case demo
Displaying a list of items is one the first skills that every iOS developer learns. We are thought how to implement a data source, and how to dequeue and setup cells. Yet, the standard approach has a couple of shortcomings. The main one for me being that it’s very hard to reuse.
To solve this problem I’ve created the SimpleDataSource framework. By using a data driven approach and reorganising responsibilities, the framework significantly decreases the amount of boilerplate code and improves reusability.
Following post showcases a simple use-case implemented using the framework.
Note: For simplicity I’ll be addressing UITableView only, but everything, including framework support, extends to UICollectionView.
For our data I chose some of the best movies ever released, most of which have a one thing in common, Steven Seagal. Along with the movies we will be presenting a short cast list.
Let’s setup the cells, models and data we will need. This step isn’t affected by our framework choice.
Instead of implementing a custom
UITableViewDataSource, we will use
AnyTableViewDataSource. We simply initialise and set it as the tableViews dataSource.
Our data source knows how to do a single thing, present
AnyDequeuableCollectionViewCellViewModel is a type-erased model that knows how to register and dequeue a single cell.
We won’t create the model by hand, but will instead allow Swift’s strong type system to do it for us.
Next, we need to implement
PresentingTableViewCell protocol in our cells. It requires a single function whose parameter is the protocols associated type. For now ignore the type constraint.
present(viewModel:) function should apply the
ViewModel parameter to the cell and optionally perform any additional cell setup.
Similarly our models need to implement the
DequeuableTableViewCellViewModel protocol. The protocol defines a
TableViewCell associated type constrained to the previously defined
PresentingTableViewCell, whose associated type is in turn constrained to
Although seemingly not as simple as the previous one, the default implementations allow us to specify only the associated type, as long as
TableViewCell.ViewModel is equal to the implementing entity.
Now to create the
AnyDequeuableCollectionViewCellViewModel simply use
tableViewPresentable computed property available on
Movie models, and present the created models on our data source.
To found out how it works in the background, take a look at the framework.
Thank you for reading! Feel free to comment and share.