SlideShare a Scribd company logo
SWIFT + VIPER
Что изменилось с переходом на Swift
• Структура модуля
• Конфигурация модуля
• PONSO -> POSO
• Переходы между модулями
• Тестирование
• Общие впечатления
Структура модуля
Структура модуля: MFVIPEMPERVVM
View: ViewInput Presenter:ViewOutput, ModuleInput Interactor: InteractorInput
Router: RouterInput
router
output
view
interactor
output
Router Promise
Reactive Interactor
View Model
Future View Presentation Model
Wireframe
Passive View
Passive View
Assembly
Структура модуля
View
(ViewInput)
Presenter

(ViewOutput,
ModuleInput)
Interactor
(InteractorInput)
Router

(RouterInput)
router
output
view interactor
output
Service
Service
Service
Entity
Entity
Структура модуля
View Presenter Interactor
Router
Service
Service
Service
Entity
Entity
NSObject Pure Swift
Структура модуля
protocol TodayWeatherInteractorOutput: class {
func setCurrentWeather(currentWeather: WeatherItem)
}
•Разделять протоколы по файлам
•Не забывать :class для weak ссылок
Структура модуля
class TodayWeatherPresenter: TodayWeatherModuleInput,
TodayWeatherViewOutput {
//MARK: TodayWeatherModuleInput
//MARK: TodayWeatherViewOutput
}
•Ошибка: Declarations from extensions cannot be overriden yet
•Нарушается целостность кода
Структура модуля
class TodayWeatherPresenter: TodayWeatherModuleInput,
TodayWeatherViewOutput {
weak var view: TodayWeatherViewInput!
var interactor: TodayWeatherInteractorInput!
var router: TodayWeatherRouterInput!
}
•Корректную конфигурацию проверять в тестах
Структура модуля
Generamba
Конфигурация модуля
Конфигурация модуля: Typhoon
class TodayWeatherAssembly: TyphoonAssembly {
enum ViperSel: Selector {
case view = "view"
case router = "router"
//...
}
dynamic func presenter() -> AnyObject {
return TyphoonDefinition.withClass
(TodayWeatherPresenter.self) { (definition) in
definition.injectProperty(ViperSel.router,
with: self.router())
definition.injectProperty(ViperSel.view,
with: self.view())
}
}
//...
}
Конфигурация модуля: Typhoon
typealias WeatherItem = (String, Int)
@objc protocol TodayWeatherInteractorInput {
func getWeatherData() -> WeatherItem
}
method cannot be marked @objc because ... cannot be represented in Objective-C
Получаем ошибку:
Конфигурация модуля: Swift DI frameworks
Swinject
let container = Container()
container.register(TodayWeatherRouterInput.self)
{ _ in TodayWeatherRouter() }
container.register(TodayWeatherViewOutput.self)
{ registrator in
TodayWeatherPresenter(router:
registrator.resolve(TodayWeatherRouterInput.self)!)
}
//Configurator
let presenter =
container.resolve(TodayWeatherRouterInput.self)
Конфигурация модуля: Swift DI frameworks
Dip
let dependencyContainer = DependencyContainer()
{ container in
container.register
{ TodayWeatherRouter() as TodayWeatherRouterInput }
container.register {
TodayWeatherPresenter(router:
try! container.resolve() as TodayWeatherRouterInput)
as TodayWeatherViewOutput
}
}
//Configurator
let router = try! dependencyContainer.resolve() as
TodayWeatherRouter
Swift DI frameworks: Проблемы
•Существующие решения - Service locators
•Runtime возможности только для NSObject наследников
•Readonly Reflection API
Конфигурация модуля: Storyboard DI
class TodayWeatherModuleInitializer: NSObject {
@IBOutlet weak var
viewController: TodayWeatherViewController!
override func awakeFromNib() {
let configurator =
TodayWeatherModuleConfigurator()
configurator.
configureModuleForViewInput(viewController)
}
}
Конфигурация модуля: Конфигуратор
class TodayWeatherModuleConfigurator:
BaseModuleConfiguratorProtocol {
func configureModuleForViewInput<UIViewController>
(viewInput: UIViewController) {
if let todayWeatherController =
viewInput as? TodayWeatherViewController {
configure(todayWeatherController)
}
}
//...
}
Конфигурация модуля: Конфигуратор
private func configure(viewController:
TodayWeatherViewController) {
let router = TodayWeatherRouter()
router.viewController = viewController
let presenter = TodayWeatherPresenter()
presenter.view = viewController
presenter.router = router
let interactor = TodayWeatherInteractor()
interactor.output = presenter
presenter.interactor = interactor
viewController.output = presenter
}
Структура модуля
View
(ViewController)
Presenter Interactor
Router
Service
Service
Service
Entity
Entity
Configurator
Initializer
Storyboard
PONSO -> POSO
PONSO -> POSO
@interface DayWeather : NSObject
@property (readonly) NSString *weather;
@property (readonly) NSString *temperature;
@property (readonly) NSString *temperatureIcon;
- (instancetype)initWithWeather:(NSString *)weather
temperature:(NSString *)temperature
temperatureIcon:(NSString *)icon;
+ (instancetype)weatherWithWeather:(NSString *)weather
temperature:(NSString *)temperature
temperatureIcon:(NSString *)icon;
@end
enum TimeOfDay: String {
case Now = "now"
case Morning = "morning"
case Afternoon = "afternoon"
case Evening = "evening"
case Night = "night"
}
struct WeatherItem {
let timeOfDay: TimeOfDay?
let weather: String?
let temperature: String?
let temperatureIconName: String?
}
PONSO -> POSO
PONSO -> POSO
•Immutability, thread safe из коробки
•struct и enum поддерживают большинство возможностей классов
•Оптимизации
Переходы между модулями
Переходы между модулями
Swizzling ?
Переходы между модулями
Protocol Extensions
Переходы между модулями: Transition Handler
protocol ViperModuleTransitionHandler: class {
func openModule(segueIdentifier: String,
configurationBlock: ConfigurationBlock)
func closeModule()
}
extension ViperModuleTransitionHandler
where Self: UIViewController {
func openModule(segueIdentifier:String,
block:ConfigurationBlock) {
let segueInfo = SegueInfo()
segueInfo.configurationBlock = block
performSegueWithIdentifier(segueIdentifier,
sender: segueInfo)
}

}
Переходы между модулями: Transition Handler
Переходы между модулями: Module View
override func prepareForSegue(segue: UIStoryboardSegue!,
sender: AnyObject?) {
guard let configurationHolder =
segue.destinationViewController else {return}
configurationBlock(configurationHolder.moduleInput)
}
Тестирование
Тестирование
OCMock
OCMProtocolMock
OCMClassMock
OCMVerify
OCMStub
Тестирование
Spy Stub Mock
Писать моки самому не сложно
Тестирование: Mocking
func testConfigureWithWeatherId() {
//given
let presenter = TodayWeatherPresenter()
let interactor = MockInteractorInput()
presenter.interactor = interactor
//when
presenter.configureViewForWeatherId("testWeatherId")
//then
XCTAssertTrue(interactor.didCallObtain)
XCTAssertEqual("testOfferId", interactor.offerId)
}
Тестирование: Mocking
class MockInteractorInput : TodayWeatherInteractorInput {
var didCallObtain = false
var weatherId : String!
func obtainWeatherById(weatherId: String) {
didCallObtain = true
self.weatherId = weatherId
}
}
Тестирование
PRIVATE
INTERNAL
PUBLIC
@testable
В результате ?
Зачем переходить на Swift
• Меньше файлов, выразительный синтаксис
• Модификаторы доступа, пространства имен
• Строгая типизация и явный nil
• Immutability из коробки
• Мультипарадигменность
Viper+ Swift
• Революции не случилось
• Модули пишутся быстрее
• Можно эффективно использовать возможности языка
• Тесты пишутся медленнее
Спасибо за внимание

More Related Content

What's hot

Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCAndrew Mayorov
 
#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах
e-Legion
 
Angular 2 vs Angular 1
Angular 2 vs Angular 1Angular 2 vs Angular 1
Angular 2 vs Angular 1
GDG Odessa
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переиграл
Eugene Zharkov
 
#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников
JSib
 
«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​
FDConf
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSГлеб Тарасов
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Ontico
 
занятие 2
занятие 2занятие 2
занятие 2ajantis
 
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Fwdays
 
сервисы в Angular js
сервисы в Angular jsсервисы в Angular js
сервисы в Angular js
yakimchuk
 
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
Mail.ru Group
 
Тестирование Web API
Тестирование Web APIТестирование Web API
Тестирование Web API
Byndyusoft
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
DevDay
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
Mikhail Shcherbakov
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийGoSharp
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersГлеб Тарасов
 
Инструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныИнструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важны
CodeFest
 
In-App-Purchases и с чем их едят
In-App-Purchases и с чем их едятIn-App-Purchases и с чем их едят
In-App-Purchases и с чем их едят
Pavel Bashmakov
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
Paul Klimov
 

What's hot (20)

Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах
 
Angular 2 vs Angular 1
Angular 2 vs Angular 1Angular 2 vs Angular 1
Angular 2 vs Angular 1
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переиграл
 
#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников
 
«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
 
Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...Пользователь точно оценит! Повышение производительности мобильных приложений ...
Пользователь точно оценит! Повышение производительности мобильных приложений ...
 
занятие 2
занятие 2занятие 2
занятие 2
 
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
 
сервисы в Angular js
сервисы в Angular jsсервисы в Angular js
сервисы в Angular js
 
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
 
Тестирование Web API
Тестирование Web APIТестирование Web API
Тестирование Web API
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложений
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
 
Инструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныИнструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важны
 
In-App-Purchases и с чем их едят
In-App-Purchases и с чем их едятIn-App-Purchases и с чем их едят
In-App-Purchases и с чем их едят
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
 

Viewers also liked

From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
Krzysztof Profic
 
VIPER - Design Pattern
VIPER - Design PatternVIPER - Design Pattern
VIPER - Design Pattern
Pedro Henrique Peralta
 
iOS viper presentation
iOS viper presentationiOS viper presentation
iOS viper presentation
Rajat Datta
 
Rambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la RamblerRambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la Rambler
RAMBLER&Co
 
Rambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPERRambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPER
RAMBLER&Co
 
Sexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroidsSexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroids
Dmytro Zaitsev
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
Introduction to VIPER Architecture
Introduction to VIPER ArchitectureIntroduction to VIPER Architecture
Introduction to VIPER Architecture
Hendy Christianto
 
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
65apps
 
[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPER[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPER
Silicon Straits
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
RAMBLER&Co
 
iOS Architecture
iOS ArchitectureiOS Architecture
iOS Architecture
Jacky Lian
 
Break the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER ModulesBreak the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER Modules
Nicola Zaghini
 
Coding like a sex
Coding like a sexCoding like a sex
Coding like a sex
Max Arshinov
 
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
e-Legion
 
Viper в ios проектах
Viper в ios проектахViper в ios проектах
Viper в ios проектах
Anvar Basharov
 
An (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPERAn (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPER
denicija
 
Rambler.iOS #6: Pagination Demystified
Rambler.iOS #6: Pagination DemystifiedRambler.iOS #6: Pagination Demystified
Rambler.iOS #6: Pagination Demystified
RAMBLER&Co
 
Rambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектураRambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектура
RAMBLER&Co
 
Emacs: многофункциональный комбайн
Emacs: многофункциональный комбайнEmacs: многофункциональный комбайн
Emacs: многофункциональный комбайн
Alex Ott
 

Viewers also liked (20)

From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
 
VIPER - Design Pattern
VIPER - Design PatternVIPER - Design Pattern
VIPER - Design Pattern
 
iOS viper presentation
iOS viper presentationiOS viper presentation
iOS viper presentation
 
Rambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la RamblerRambler.iOS #5: VIPER a la Rambler
Rambler.iOS #5: VIPER a la Rambler
 
Rambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPERRambler.iOS #5: Подмодули в VIPER
Rambler.iOS #5: Подмодули в VIPER
 
Sexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroidsSexy Architecting. VIPER: MVP on steroids
Sexy Architecting. VIPER: MVP on steroids
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Introduction to VIPER Architecture
Introduction to VIPER ArchitectureIntroduction to VIPER Architecture
Introduction to VIPER Architecture
 
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
ReactiveCocoa: делаем отзывчивое приложение (П. Руденко)
 
[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPER[SIP 2015] iOS Proposal: VIPER
[SIP 2015] iOS Proposal: VIPER
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
 
iOS Architecture
iOS ArchitectureiOS Architecture
iOS Architecture
 
Break the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER ModulesBreak the monolith with (B)VIPER Modules
Break the monolith with (B)VIPER Modules
 
Coding like a sex
Coding like a sexCoding like a sex
Coding like a sex
 
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
 
Viper в ios проектах
Viper в ios проектахViper в ios проектах
Viper в ios проектах
 
An (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPERAn (highly elementary) introduction to VIPER
An (highly elementary) introduction to VIPER
 
Rambler.iOS #6: Pagination Demystified
Rambler.iOS #6: Pagination DemystifiedRambler.iOS #6: Pagination Demystified
Rambler.iOS #6: Pagination Demystified
 
Rambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектураRambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектура
 
Emacs: многофункциональный комбайн
Emacs: многофункциональный комбайнEmacs: многофункциональный комбайн
Emacs: многофункциональный комбайн
 

Similar to Rambler.iOS #5: VIPER и Swift

iOS-05_2-UIKit
iOS-05_2-UIKitiOS-05_2-UIKit
iOS-05_2-UIKit
Noveo
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelper
DataArt
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеГлеб Тарасов
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Ontico
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)7bits
 
Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в android
DataArt
 
Дмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPERДмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPER
CocoaHeads
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работыPaul Stashevsky
 
Frontendlab: Фреймворк Duranda js - Виктор Сотов
Frontendlab: Фреймворк Duranda js  - Виктор СотовFrontendlab: Фреймворк Duranda js  - Виктор Сотов
Frontendlab: Фреймворк Duranda js - Виктор Сотов
GeeksLab Odessa
 
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)
GoSharp
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
CodeFest
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014Andrey Listochkin
 
Mate framework
Mate frameworkMate framework
Mate framework
BugzHunter
 
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting
KewpaN
 
ASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton VidishchevASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton Vidishchev
Alex Tumanoff
 

Similar to Rambler.iOS #5: VIPER и Swift (20)

iOS-05_2-UIKit
iOS-05_2-UIKitiOS-05_2-UIKit
iOS-05_2-UIKit
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelper
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
Антон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в androidАнтон Валюх - Использование паттерна Mvvm в android
Антон Валюх - Использование паттерна Mvvm в android
 
Дмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPERДмитрий Котенко – Реактивный VIPER
Дмитрий Котенко – Реактивный VIPER
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
Frontendlab: Фреймворк Duranda js - Виктор Сотов
Frontendlab: Фреймворк Duranda js  - Виктор СотовFrontendlab: Фреймворк Duranda js  - Виктор Сотов
Frontendlab: Фреймворк Duranda js - Виктор Сотов
 
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)
 
Mvc3
Mvc3Mvc3
Mvc3
 
Изоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесьИзоморфный JavaScript — будущее уже здесь
Изоморфный JavaScript — будущее уже здесь
 
IoC & Dependency Injection
IoC & Dependency InjectionIoC & Dependency Injection
IoC & Dependency Injection
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014
 
Mate framework
Mate frameworkMate framework
Mate framework
 
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting
 
ASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton VidishchevASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton Vidishchev
 
The Best Portlet
The Best PortletThe Best Portlet
The Best Portlet
 

More from RAMBLER&Co

RDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRDSDataSource: Основы LLVM
RDSDataSource: Основы LLVM
RAMBLER&Co
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
RAMBLER&Co
 
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
RAMBLER&Co
 
Rambler.iOS #9: Life with out of memory
Rambler.iOS #9: Life with out of memoryRambler.iOS #9: Life with out of memory
Rambler.iOS #9: Life with out of memory
RAMBLER&Co
 
RDSDataSource: OCLint
RDSDataSource: OCLintRDSDataSource: OCLint
RDSDataSource: OCLint
RAMBLER&Co
 
RDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграммRDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграмм
RAMBLER&Co
 
RDSDataSource: App Thinning
RDSDataSource: App ThinningRDSDataSource: App Thinning
RDSDataSource: App Thinning
RAMBLER&Co
 
RDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по Dip
RAMBLER&Co
 
RDSDataSource: YapDatabase
RDSDataSource: YapDatabaseRDSDataSource: YapDatabase
RDSDataSource: YapDatabase
RAMBLER&Co
 
Rambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCoreRambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCore
RAMBLER&Co
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеров
RAMBLER&Co
 
RDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperiencedRDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperienced
RAMBLER&Co
 
RDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDKRDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDK
RAMBLER&Co
 
RDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOSRDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOS
RAMBLER&Co
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
RAMBLER&Co
 
RDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwiftRDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwift
RAMBLER&Co
 
Rambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейса
RAMBLER&Co
 
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложенииRambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
RAMBLER&Co
 
Rambler.iOS #7: Интернет-эквайринг 101
Rambler.iOS #7: Интернет-эквайринг 101Rambler.iOS #7: Интернет-эквайринг 101
Rambler.iOS #7: Интернет-эквайринг 101
RAMBLER&Co
 
Rambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуйRambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуй
RAMBLER&Co
 

More from RAMBLER&Co (20)

RDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRDSDataSource: Основы LLVM
RDSDataSource: Основы LLVM
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
 
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
 
Rambler.iOS #9: Life with out of memory
Rambler.iOS #9: Life with out of memoryRambler.iOS #9: Life with out of memory
Rambler.iOS #9: Life with out of memory
 
RDSDataSource: OCLint
RDSDataSource: OCLintRDSDataSource: OCLint
RDSDataSource: OCLint
 
RDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграммRDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграмм
 
RDSDataSource: App Thinning
RDSDataSource: App ThinningRDSDataSource: App Thinning
RDSDataSource: App Thinning
 
RDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по Dip
 
RDSDataSource: YapDatabase
RDSDataSource: YapDatabaseRDSDataSource: YapDatabase
RDSDataSource: YapDatabase
 
Rambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCoreRambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCore
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеров
 
RDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperiencedRDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperienced
 
RDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDKRDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDK
 
RDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOSRDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOS
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
RDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwiftRDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwift
 
Rambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейса
 
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложенииRambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
 
Rambler.iOS #7: Интернет-эквайринг 101
Rambler.iOS #7: Интернет-эквайринг 101Rambler.iOS #7: Интернет-эквайринг 101
Rambler.iOS #7: Интернет-эквайринг 101
 
Rambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуйRambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуй
 

Rambler.iOS #5: VIPER и Swift