From 12db64c98c8bfb96289b71a554b32666265ca04a Mon Sep 17 00:00:00 2001 From: Matthew Baranowski Date: Fri, 2 Jun 2017 11:02:56 -0400 Subject: [PATCH] refactor the two existing switch statements into polymorphic dispatch switch statement in condigureCell is replaced with AnyCellConfigurable.configure which force-casts and calls the type-specific CellConfigurable.configure we can assume all cells are of type AnyCellConfigurable because we register only using the cellTypes array, and that only allows AnyCellConfigurable.Type. the switch statement in cellType(for:) is replaced by the fact that CellViewModelType has an associatedtype of the cell type is can configure. --- .../UserInterfaceState.xcuserstate | Bin 0 -> 17093 bytes SwiftyViewModels/CellViewModels.swift | 35 +++++++++++++++--- .../InstrumentViewController.swift | 32 +++------------- SwiftyViewModels/InstrumentViewModel.swift | 23 ++++-------- 4 files changed, 42 insertions(+), 48 deletions(-) create mode 100644 SwiftyViewModels.xcodeproj/project.xcworkspace/xcuserdata/mattbaranowski.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/SwiftyViewModels.xcodeproj/project.xcworkspace/xcuserdata/mattbaranowski.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftyViewModels.xcodeproj/project.xcworkspace/xcuserdata/mattbaranowski.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5d93e9c44794775187fc03e496f593635bff1e67 GIT binary patch literal 17093 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 P5b;}*5>#zKh4%jkOJ`2d literal 0 HcmV?d00001 diff --git a/SwiftyViewModels/CellViewModels.swift b/SwiftyViewModels/CellViewModels.swift index 84f03bf..466685c 100644 --- a/SwiftyViewModels/CellViewModels.swift +++ b/SwiftyViewModels/CellViewModels.swift @@ -9,15 +9,38 @@ import Foundation import UIKit -protocol CellViewModelType { } +protocol AnyCellViewModelType { + var reuseIdentifier: String { get } +} + +protocol CellViewModelType: AnyCellViewModelType { + associatedtype CellType: AnyCellConfigurable +} -protocol CellConfigurable { +extension CellViewModelType { + var reuseIdentifier: String { + return CellType.self.reuseIdentifier + } +} + +protocol AnyCellConfigurable: NibLoadable { + func configure(with viewModel: AnyCellViewModelType) +} + +protocol CellConfigurable: AnyCellConfigurable { associatedtype ViewModelType: CellViewModelType func configure(with viewModel: ViewModelType) } -struct KeyBoardCellViewModel: CellViewModelType { +extension CellConfigurable { + func configure(with viewModel: AnyCellViewModelType) { + configure(with: viewModel as! ViewModelType) + } +} +struct KeyBoardCellViewModel: CellViewModelType { + typealias CellType = KeyboardTableViewCell + let titleField: String let synthesizerField: String let numberOfKeyField: String @@ -32,7 +55,8 @@ struct KeyBoardCellViewModel: CellViewModelType { } struct GuitarCellViewModel: CellViewModelType { - + typealias CellType = GuitarTableViewCell + let titleField: String let stringField: String let image: UIImage @@ -52,7 +76,8 @@ struct GuitarCellViewModel: CellViewModelType { } struct AccessoryViewModel: CellViewModelType { - + typealias CellType = AccessoryItemTableViewCell + let titleField: String let detailField: String let image: UIImage diff --git a/SwiftyViewModels/InstrumentViewController.swift b/SwiftyViewModels/InstrumentViewController.swift index 163efac..c23e3c1 100644 --- a/SwiftyViewModels/InstrumentViewController.swift +++ b/SwiftyViewModels/InstrumentViewController.swift @@ -25,9 +25,9 @@ class InstrumentViewController: UIViewController { } func registerCells() { - tableView.register(cell: GuitarTableViewCell.self) - tableView.register(cell: KeyboardTableViewCell.self) - tableView.register(cell: AccessoryItemTableViewCell.self) + for cellType in InstrumentViewModel.cellTypes { + tableView.register(cell: cellType) + } } } @@ -42,15 +42,9 @@ extension InstrumentViewController: UITableViewDataSource { } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - - let cellType = viewModel.cellType(for: indexPath) - let cell = tableView.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier, for: indexPath) - let cellViewModel = viewModel.viewModel(for: indexPath) - - configureCell(cell, cellViewModel: cellViewModel) - - + let cell = tableView.dequeueReusableCell(withIdentifier: cellViewModel.reuseIdentifier, for: indexPath) + (cell as! AnyCellConfigurable).configure(with: cellViewModel) return cell } @@ -58,22 +52,6 @@ extension InstrumentViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 128.0 } - - func configureCell(_ cell: UITableViewCell, cellViewModel: CellViewModelType) { - - switch (cell, cellViewModel) { - case (let cell as GuitarTableViewCell, let cellViewModel as GuitarCellViewModel): - cell.configure(with: cellViewModel) - case (let cell as KeyboardTableViewCell, let cellViewModel as KeyBoardCellViewModel): - cell.configure(with: cellViewModel) - case (let cell as AccessoryItemTableViewCell, let cellViewModel as AccessoryViewModel): - cell.configure(with: cellViewModel) - default: - fatalError("Mismatched cell and view model") - - } - - } } extension InstrumentViewController: UITableViewDelegate { diff --git a/SwiftyViewModels/InstrumentViewModel.swift b/SwiftyViewModels/InstrumentViewModel.swift index 9b4b9b8..e5ed013 100644 --- a/SwiftyViewModels/InstrumentViewModel.swift +++ b/SwiftyViewModels/InstrumentViewModel.swift @@ -23,6 +23,12 @@ struct InstrumentViewModel { let keyboardViewModels: [KeyBoardCellViewModel] let accessoryViewModels: [AccessoryViewModel] + static let cellTypes: [AnyCellConfigurable.Type] = [ + GuitarTableViewCell.self, + KeyboardTableViewCell.self, + AccessoryItemTableViewCell.self + ] + var sectionCount: Int { return Section.all.count } @@ -48,7 +54,7 @@ struct InstrumentViewModel { } } - func viewModel(for indexPath: IndexPath) -> CellViewModelType { + func viewModel(for indexPath: IndexPath) -> AnyCellViewModelType { guard let section = Section(rawValue: indexPath.section) else { fatalError("Invalid section") } @@ -63,19 +69,4 @@ struct InstrumentViewModel { } } - - func cellType(for indexPath: IndexPath) -> NibLoadable.Type { - guard let section = Section(rawValue: indexPath.section) else { - fatalError("Invalid section") - } - - switch section { - case .guitar: - return GuitarTableViewCell.self - case .keyboard: - return KeyboardTableViewCell.self - case .accessory: - return AccessoryItemTableViewCell.self - } - } }