53
Зимин Александр iOS Developer Product Designer

«MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Embed Size (px)

Citation preview

Page 1: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Зимин Александр iOS Developer

Product Designer

Page 2: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик
Page 3: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

• Про работу с базовыми инструментами (UICollectionView, Swift и прочие) - 26%

• Про подходы к разработке крупных проектов (MVVM, CI и прочие) - 37%

Page 4: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM в Swift

Page 5: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

План

MVVM Swift

Page 6: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

План

Swift не Objective-C

POP

Component-based

Page 7: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

План

MVVM Swift Демонстрация

Page 8: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

План

MVVM Swift Демонстрация

Page 9: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVC

Controller

ViewModel

Page 10: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVC

Controller

Model

View

Page 11: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM

Controller

View

ModelModel

Controller

View

ViewModel

Model

Page 12: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVC

struct Person { var firstName: String var secondName: String }s

Page 13: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVC

struct Person { var firstName: String var secondName: String }s

class ViewController: UIViewController { var person: Person! @IBOutlet var nameLabel: UILabel! }s

Page 14: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVC

struct Person { var firstName: String var secondName: String }s

class ViewController: UIViewController { var person: Person! @IBOutlet var nameLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() nameLabel.text = "\(person.firstName) \(person.secondName)" } }s

Page 15: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM

struct Person { var firstName: String var secondName: String }s

struct PersonModel { var person: Person var name: String { return "\(person.firstName) \(person.secondName)" } }

class ViewController: UIViewController { var person: Person! @IBOutlet var nameLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() nameLabel.text = "\(person.firstName) \(person.secondName)" } }s

Page 16: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM

struct Person { var firstName: String var secondName: String }s

struct PersonModel { var person: Person var name: String { return "\(person.firstName) \(person.secondName)" } }

class ViewController: UIViewController { var personModel: PersonModel! @IBOutlet var nameLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() nameLabel.text = personModel.name } }s

Page 17: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM Схема

ViewModel Model

Уведомляет

Обновляет

Page 18: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM Схема

ViewModel Model

Уведомляет

Обновляет

ControllerViewView

Уведомляет

Воздействует

Page 19: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM Схема

ViewModel Model

Уведомляет

Обновляет

ControllerViewView

Уведомляет

Воздействует

• Обновляет:

• gameSession.attempts += 1

• Воздействует:

• gameSessionEntity.loseAction()

Page 20: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM Уведомляет

• KVO:

• Плохо (никаких enum или struct)

• Functional reactive programming:

• ReactiveCocoa

• RxSwift

Page 21: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM Уведомляет

• KVO

• Плохо (никаких enum или struct)

• Functional reactive programming:

• ReactiveCocoa

• RxSwift

http://stackoverflow.com/questions/32542846/reactivecocoa-vs-rxswift-pros-and-cons

https://www.raywenderlich.com/126522/reactivecocoa-vs-rxswift

Page 22: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM RxSwift

var name = Variable("Value")

Page 23: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM RxSwift

var name = Variable("Value")

let subscribe = name.asObservable().subscribeNext { (value) in print(value) }s

Page 24: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM RxSwift

var name = Variable("Value")

let subscribe = name.asObservable().subscribeNext { (value) in print(value) }s

name.value = "New Value" subscribe.dispose() name.value = "Another Value"

Value New Value

Page 25: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM RxSwift

Page 26: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM Плюсы

• Более компактная логика

• Гибкость тестирования

• Правильное переиспользование

Page 27: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM Минусы

• Более затратно по ресурсам

• Встречаются абсурдные ситуации

Page 28: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

MVVM Минусы

Ash Furrow

Page 29: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

План

MVVM Swift Демонстрация

Page 30: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift Не Objective-C

• Вы что-то делаете не так если:

• Наследуете NSObject

• Частое используете class

• Слово protocol и Delegate всегда на одной строчке

• Последний раз видели T в C#

Page 31: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift Не Objective-C

• Сложности:

• Другой подход

• Кажется неправильным

Page 32: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift Не Objective-C

A

B

Page 33: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift Не Objective-C

A

B

Page 34: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift Не Objective-C

• В какую сторону смотреть

• POP (Protocol-Oriented Programming)

• Protocols, Value Type

• Functional reactive programming

• Generic

• State machine

• Enums

Page 35: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift POP

https://www.youtube.com/watch?v=71AS4rMrAVk

Page 36: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift POP в Swift

• В начале любой иерархии протокол

• Приоритетное использование Value Type (struct, enum)

Page 37: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

protocol ColletionItem { var id: String { get } var name: String { get } }s

Swift POP в Swift

Page 38: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

protocol ColletionItem { var id: String { get } var name: String { get } }s

struct SongItem: ColletionItem { let id: String private(set) var name: String // ... init(id: String, name: String) { self.id = id self.name = name } }

Swift POP в Swift

Page 39: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

protocol ColletionItem { var id: String { get } var name: String { get } }s

extension ColletionItem { var title: String { if name.characters.count > 0 { return name } return "Uncnown" } }

Swift POP в Swift

Page 40: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift Inheritance-Based Design

https://developer.apple.com/library/ios/documentation/General/Conceptual/GameplayKit_Guide/EntityComponent.html

Page 41: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift Inheritance-Based Design

https://developer.apple.com/library/ios/documentation/General/Conceptual/GameplayKit_Guide/EntityComponent.html

Page 42: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Swift Component-Based Design

https://developer.apple.com/library/ios/documentation/General/Conceptual/GameplayKit_Guide/EntityComponent.html

Page 43: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

protocol TextFormatType { var textFont: UIFont { get } var textColor: UIColor { get } }s

Swift Component-Based Design

Page 44: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

protocol TextFormatType { var textFont: UIFont { get } var textColor: UIColor { get } }s

extension TextFormatType { var textFont: UIFont { return .systemFontOfSize(12) } var textColor: UIColor { return .blackColor() } }

Swift Component-Based Design

Page 45: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

protocol ViewFormatType { var backgroundColor: UIColor { get } var cornerRadius: CGFloat { get } }s

Swift Component-Based Design

Page 46: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

protocol ViewFormatType { var backgroundColor: UIColor { get } var cornerRadius: CGFloat { get } }s

extension ViewFormatType { var backgroundColor: UIColor { return .whiteColor() } var cornerRadius: CGFloat { return 0 } }

Swift Component-Based Design

Page 47: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

struct TitleLabelAppearanceModel: ViewFormatType, TextFormatType { var textFont: UIFont { return .boldSystemFontOfSize(16) } }

Swift Component-Based Design

Page 48: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

protocol TitleLabelAppearanceType: ViewFormatType, TextFormatType { }

extension TitleLabelAppearanceType { var textFont: UIFont { return .boldSystemFontOfSize(16) } }

Swift Component-Based Design

Page 49: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

План

MVVM Swift Демонстрация

Page 50: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Демонстрация

Page 51: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

• https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52 - Паттерны в iOS

• http://artsy.github.io/blog/2015/09/24/mvvm-in-swift/ - Проблемы MVVM в Swift

• https://www.captechconsulting.com/blogs/ios-9-tutorial-series-protocol-oriented-programming-with-uikit - Хороший пример использования POP

• https://github.com/ReactKit/SwiftState - Машина состояний в Swift

Полезные ссылки

Page 52: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Зимин Александр [email protected]

@ZiminAlex

Page 53: «MVVM в Swift», Александр Зимин, независимый iOS-разработчик

Зимин Александр [email protected]

@ZiminAlex

Спасибо за внимание