Kaya Thomas

Jun 29, 2018 ⋅ 2 min read

CaseIterable in Action

In my last post, I started off refactoring We Read Too into MVMM with RxSwift. In the “What’s Next” section I mentioned that I need to add another field to the suggestion form. So far, the suggestion form only has a two text fields, one for title and the other for author, and a button for submitting the form.

In the current version of the app, there is a third text field for the user to write in the genre of the book they are suggesting. Unfortunately having that third text field leads to a lot of book suggestions that are out of the scope of the app. We Read Too focuses on children’s and young adult books, so the third field should be a picker view instead of a text field so I can pre-populate the options for genre. This hopefully will lead to more relevant submissions.

In Swift 4.2, enums can now adhere to a CaseIterable protocol which allows us to easily get an array of all the enum cases and have access to the total count without having to implement that ourselves in a public variable on the enum. You can read the proposal for CaseIterable here.

enum Category: CaseIterable {
    case PB, CB, MG, YA
    var description: String {
        switch self {
        case .PB: return "Picture Book"
        case .CB: return "Chapter Book"
        case .MG: return "Middle Grade"
        case .YA: return "Young Adult"

The code snippet above shows my enum Category. Category will be used for the picker view in our suggestion and later as well when we populate the collection view of books which will be filtered by these particular categories. You may wonder why I just don’t make the cases equal to what’s in the description variable? Well we’re going to need the shorthand names (PB, CB, MG, YA) later for pulling the book data from Firebase.

  .bind(to: self.categoryPickerView.rx.itemTitles) { _, item in
    return "\(item.description)"
  .disposed(by: disposeBag)
  .subscribe(onNext: { [weak self] row, component in
    self?.vm.inputs.categoryChanged(category: Category.allCases[row].description)
  .disposed(by: disposeBag)

Above is the enum in action, we use the just operator to create an Observable that emits the array of our all the cases that we can bind to the category picker view’s item titles. Then when any of the items are selected when can send it back to our view model and use the selected item to complete the suggestion form.

Photo of the simulator showing the picker view with the enum cases.

What's Next

Now that we’ve gotten our complete form, we can use this data to create a decodable Suggestion object and send it off to Firebase where we’re storing all the suggestions.

Tagged with: