56
P !MVVM @NATASHATHEROBOT

Protocol Oriented MVVM - Auckland iOS Meetup

Embed Size (px)

Citation preview

Page 1: Protocol Oriented MVVM - Auckland iOS Meetup

P!MVVM@NATASHATHEROBOT

Page 2: Protocol Oriented MVVM - Auckland iOS Meetup
Page 3: Protocol Oriented MVVM - Auckland iOS Meetup
Page 4: Protocol Oriented MVVM - Auckland iOS Meetup

"Swift Is a Protocol-Oriented Programming Language"

— Dave Abrahams, Professor of Blowing-Your-Mind

Page 5: Protocol Oriented MVVM - Auckland iOS Meetup

UITableViewDelegate UITableViewDataSourceUITextFieldDelegateNSURLSessionDelegateCLLocationManagerDelegateMCSessionDelegate

Page 6: Protocol Oriented MVVM - Auckland iOS Meetup

!

Page 7: Protocol Oriented MVVM - Auckland iOS Meetup

!

Page 8: Protocol Oriented MVVM - Auckland iOS Meetup

!

Page 9: Protocol Oriented MVVM - Auckland iOS Meetup

!

Page 10: Protocol Oriented MVVM - Auckland iOS Meetup

Artsy Engineering: MVVM in Swift

Page 11: Protocol Oriented MVVM - Auckland iOS Meetup

MODELlet amount = 6729383.99

Page 12: Protocol Oriented MVVM - Auckland iOS Meetup

VIEWYour balance is $6,729,383.99

Page 13: Protocol Oriented MVVM - Auckland iOS Meetup

VIEWMODELstruct AccountViewModel { let displayBalance: String

init(model: BankAccount) { let formattedBalance = model.balance.currencyValue displayBalance = "Your balance is \(formattedBalance)" }}

Page 14: Protocol Oriented MVVM - Auckland iOS Meetup

VIEWCONTROLLERvar viewModel = ViewModel(model: Account)

Page 15: Protocol Oriented MVVM - Auckland iOS Meetup
Page 16: Protocol Oriented MVVM - Auckland iOS Meetup
Page 17: Protocol Oriented MVVM - Auckland iOS Meetup
Page 18: Protocol Oriented MVVM - Auckland iOS Meetup

VIEWCONTROLLERvar viewModel = ViewModel(model: Account)

Page 19: Protocol Oriented MVVM - Auckland iOS Meetup

PROTOCOLS!!!

Page 20: Protocol Oriented MVVM - Auckland iOS Meetup
Page 21: Protocol Oriented MVVM - Auckland iOS Meetup

THE PROBLEMclass SwitchWithTextTableViewCell: UITableViewCell {

func configure( title: String, titleFont: UIFont, titleColor: UIColor, switchOn: Bool, switchColor: UIColor = .purpleColor(), onSwitchToggleHandler: onSwitchToggleHandlerType? = nil) { // configure views here }

}

Page 22: Protocol Oriented MVVM - Auckland iOS Meetup

PROTOCOLS TO THE RESCUE !

Page 23: Protocol Oriented MVVM - Auckland iOS Meetup

protocol SwitchWithTextCellProtocol { var title: String { get } var titleFont: UIFont { get } var titleColor: UIColor { get }

var switchOn: Bool { get } var switchColor: UIColor { get }

func onSwitchTogleOn(on: Bool)}

Page 24: Protocol Oriented MVVM - Auckland iOS Meetup

extension SwitchWithTextCellProtocol {

var switchColor: UIColor { return .purpleColor() }

}

Page 25: Protocol Oriented MVVM - Auckland iOS Meetup

class SwitchWithTextTableViewCell: UITableViewCell {

func configure(withDelegate delegate: SwitchWithTextCellProtocol) { // configure views here }

}

Page 26: Protocol Oriented MVVM - Auckland iOS Meetup

struct MinionModeViewModel: SwitchWithTextCellProtocol { var title = "Minion Mode!!!" var switchOn = true

var switchColor: UIColor { return .yellowColor() }

func onSwitchTogleOn(on: Bool) { if on { print("The Minions are here to stay!") } else { print("The Minions went out to play!") } }}

Page 27: Protocol Oriented MVVM - Auckland iOS Meetup

CELLFORROWATINDEXPATH// YourViewController.swiftlet cell = tableView.dequeueReusableCellWithIdentifier("SwitchWithTextTableViewCell", forIndexPath: indexPath) as! SwitchWithTextTableViewCell

// this is where the magic happens!cell.configure(withDelegate: MinionModeViewModel())

return cell

Page 28: Protocol Oriented MVVM - Auckland iOS Meetup

!

Page 29: Protocol Oriented MVVM - Auckland iOS Meetup

Page 30: Protocol Oriented MVVM - Auckland iOS Meetup

protocol SwitchWithTextCellDataSource { var title: String { get } var switchOn: Bool { get }}

protocol SwitchWithTextCellDelegate { func onSwitchTogleOn(on: Bool)

var switchColor: UIColor { get } var textColor: UIColor { get } var font: UIFont { get }}

Page 31: Protocol Oriented MVVM - Auckland iOS Meetup

// SwitchWithTextTableViewCell

func configure(withDataSource dataSource: SwitchWithTextCellDataSource, delegate: SwitchWithTextCellDelegate?) { // configure views here }

Page 32: Protocol Oriented MVVM - Auckland iOS Meetup

struct MinionModeViewModel: SwitchWithTextCellDataSource { var title = "Minion Mode!!!" var switchOn = true}

Page 33: Protocol Oriented MVVM - Auckland iOS Meetup

extension MinionModeViewModel: SwitchWithTextCellDelegate {

var switchColor: UIColor { return .yellowColor() }

func onSwitchTogleOn(on: Bool) { if on { print("The Minions are here to stay!") } else { print("The Minions went out to play!") } }}

Page 34: Protocol Oriented MVVM - Auckland iOS Meetup

// SettingsViewController

let viewModel = MinionModeViewModel()cell.configure(withDataSource: viewModel, delegate: viewModel)return cell

Page 35: Protocol Oriented MVVM - Auckland iOS Meetup

!

Page 36: Protocol Oriented MVVM - Auckland iOS Meetup

@MHOLLEMANS: MIXINS AND TRAITS IN SWIFT 2.0

Page 37: Protocol Oriented MVVM - Auckland iOS Meetup
Page 38: Protocol Oriented MVVM - Auckland iOS Meetup
Page 39: Protocol Oriented MVVM - Auckland iOS Meetup

class AIPlayer: GameObject, AITrait, GunTrait, RenderTrait, HealthTrait { ...}

class ZapMonster: GameObject, GunTrait, RenderTrait, HealthTrait, MovementTrait { ...}

Page 40: Protocol Oriented MVVM - Auckland iOS Meetup

! "

Page 41: Protocol Oriented MVVM - Auckland iOS Meetup

protocol TextPresentable { var text: String { get } var textColor: UIColor { get } var font: UIFont { get }}

protocol SwitchPresentable { var switchOn: Bool { get } var switchColor: UIColor { get }

func onSwitchTogleOn(on: Bool)}

Page 42: Protocol Oriented MVVM - Auckland iOS Meetup

protocol ImagePresentable { var imageName: String { get }}

protocol TextFieldPresentable { var placeholder: String { get } var text: String { get }

func onTextFieldDidEndEditing(textField: UITextField)}

Page 43: Protocol Oriented MVVM - Auckland iOS Meetup

extension TextPresentable {

var textColor: UIColor { return .blackColor() }

var font: UIFont { return .systemFontOfSize(17) }}

Page 44: Protocol Oriented MVVM - Auckland iOS Meetup

!!!class SwitchWithTextTableViewCell: UITableViewCell {

func configure<T where T: TextPresentable, T: SwitchPresentable>(withPresenter presenter: T) // configure views here }}

Page 45: Protocol Oriented MVVM - Auckland iOS Meetup

!!!!!!typealias SwitchWithTextViewPresentable = protocol<TextPresentable, SwitchPresentable>

class SwitchWithTextTableViewCell: UITableViewCell {

func configure(withPresenter presenter: T) // configure views here }}

Page 46: Protocol Oriented MVVM - Auckland iOS Meetup

extension MinionModeViewModel: TextPresentable { var text: String { return "Minion Mode" } var textColor: UIColor { return .blackColor() } var font: UIFont { return .systemFontOfSize(17.0) }}

Page 47: Protocol Oriented MVVM - Auckland iOS Meetup

extension MinionModeViewModel: SwitchPresentable { var switchOn: Bool { return false } var switchColor: UIColor { return .yellowColor() }

func onSwitchTogleOn(on: Bool) { if on { print("The Minions are here to stay!") } else { print("The Minions went out to play!") } }}

Page 48: Protocol Oriented MVVM - Auckland iOS Meetup

let cell = tableView.dequeueReusableCellWithIdentifier("SwitchWithTextTableViewCell", forIndexPath: indexPath) as! SwitchWithTextTableViewCell

let viewModel = MinionModeViewModel()cell.configure(withPresenter: viewModel)return cell

Page 49: Protocol Oriented MVVM - Auckland iOS Meetup

!"#

Page 50: Protocol Oriented MVVM - Auckland iOS Meetup

"Change is the only constant."— Unknown

Page 51: Protocol Oriented MVVM - Auckland iOS Meetup
Page 52: Protocol Oriented MVVM - Auckland iOS Meetup

typealias SwitchWithTextViewPresentable = protocol<TextPresentable, SwitchPresentable, ImagePresentable>

class SwitchWithTextTableViewCell: UITableViewCell {

func configure(withPresenter presenter: T) // configure views here }}

Page 53: Protocol Oriented MVVM - Auckland iOS Meetup

extension MinionModeViewModel: ImagePresentable { var imageName: String { return "minionParty.png" }}

Page 54: Protocol Oriented MVVM - Auckland iOS Meetup

!"

Page 55: Protocol Oriented MVVM - Auckland iOS Meetup

> Use Protocols to Configure Your Views> Use Protocol Extensions for Defaults

> Use ViewModels to Provide Data for the Protocols

Page 56: Protocol Oriented MVVM - Auckland iOS Meetup

HOW CAN WE MAKE THIS BETTER?