Upload
mailru-group
View
3.763
Download
8
Embed Size (px)
Citation preview
Зимин Александр iOS Developer
Product Designer
• Про работу с базовыми инструментами (UICollectionView, Swift и прочие) - 26%
• Про подходы к разработке крупных проектов (MVVM, CI и прочие) - 37%
MVVM в Swift
План
MVVM Swift
План
Swift не Objective-C
POP
Component-based
План
MVVM Swift Демонстрация
План
MVVM Swift Демонстрация
MVC
Controller
ViewModel
MVC
Controller
Model
View
MVVM
Controller
View
ModelModel
Controller
View
ViewModel
Model
MVC
struct Person { var firstName: String var secondName: String }s
MVC
struct Person { var firstName: String var secondName: String }s
class ViewController: UIViewController { var person: Person! @IBOutlet var nameLabel: UILabel! }s
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
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
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
MVVM Схема
ViewModel Model
Уведомляет
Обновляет
MVVM Схема
ViewModel Model
Уведомляет
Обновляет
ControllerViewView
Уведомляет
Воздействует
MVVM Схема
ViewModel Model
Уведомляет
Обновляет
ControllerViewView
Уведомляет
Воздействует
• Обновляет:
• gameSession.attempts += 1
• Воздействует:
• gameSessionEntity.loseAction()
MVVM Уведомляет
• KVO:
• Плохо (никаких enum или struct)
• Functional reactive programming:
• ReactiveCocoa
• RxSwift
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
MVVM RxSwift
var name = Variable("Value")
MVVM RxSwift
var name = Variable("Value")
let subscribe = name.asObservable().subscribeNext { (value) in print(value) }s
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
MVVM RxSwift
MVVM Плюсы
• Более компактная логика
• Гибкость тестирования
• Правильное переиспользование
MVVM Минусы
• Более затратно по ресурсам
• Встречаются абсурдные ситуации
План
MVVM Swift Демонстрация
Swift Не Objective-C
• Вы что-то делаете не так если:
• Наследуете NSObject
• Частое используете class
• Слово protocol и Delegate всегда на одной строчке
• Последний раз видели T в C#
Swift Не Objective-C
• Сложности:
• Другой подход
• Кажется неправильным
Swift Не Objective-C
A
B
Swift Не Objective-C
A
B
Swift Не Objective-C
• В какую сторону смотреть
• POP (Protocol-Oriented Programming)
• Protocols, Value Type
• Functional reactive programming
• Generic
• State machine
• Enums
Swift POP в Swift
• В начале любой иерархии протокол
• Приоритетное использование Value Type (struct, enum)
protocol ColletionItem { var id: String { get } var name: String { get } }s
Swift POP в Swift
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
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
Swift Inheritance-Based Design
https://developer.apple.com/library/ios/documentation/General/Conceptual/GameplayKit_Guide/EntityComponent.html
Swift Inheritance-Based Design
https://developer.apple.com/library/ios/documentation/General/Conceptual/GameplayKit_Guide/EntityComponent.html
Swift Component-Based Design
https://developer.apple.com/library/ios/documentation/General/Conceptual/GameplayKit_Guide/EntityComponent.html
protocol TextFormatType { var textFont: UIFont { get } var textColor: UIColor { get } }s
Swift Component-Based Design
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
protocol ViewFormatType { var backgroundColor: UIColor { get } var cornerRadius: CGFloat { get } }s
Swift Component-Based Design
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
struct TitleLabelAppearanceModel: ViewFormatType, TextFormatType { var textFont: UIFont { return .boldSystemFontOfSize(16) } }
Swift Component-Based Design
protocol TitleLabelAppearanceType: ViewFormatType, TextFormatType { }
extension TitleLabelAppearanceType { var textFont: UIFont { return .boldSystemFontOfSize(16) } }
Swift Component-Based Design
План
MVVM Swift Демонстрация
Демонстрация
• 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
Полезные ссылки
Зимин Александр [email protected]
@ZiminAlex