Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
JavaScript, который мы пишем, не всегда исполняется, как мы думаем. Виртуальные машины, исполняющие его, делают многое, чтобы он работал быстрее. Но они не всесильны, и чтобы сделать код действительно быстрым, нужно знать их особенности и как все работает под капотом.
Поговорим об этих особенностях, что может служить причиной потери производительности, как это диагностировать и как делать код действительно быстрым. Доклад базируется на опыте, полученном в ходе работы над такими проектами как basis.js (весьма быстрый фреймворк для SPA), CSSO (минификатор CSS, который из медленного стал один из самых быстрых), CSSTree (самый быстрый детальный CSS парсер) и других.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
JavaScript, который мы пишем, не всегда исполняется, как мы думаем. Виртуальные машины, исполняющие его, делают многое, чтобы он работал быстрее. Но они не всесильны, и чтобы сделать код действительно быстрым, нужно знать их особенности и как все работает под капотом.
Поговорим об этих особенностях, что может служить причиной потери производительности, как это диагностировать и как делать код действительно быстрым. Доклад базируется на опыте, полученном в ходе работы над такими проектами как basis.js (весьма быстрый фреймворк для SPA), CSSO (минификатор CSS, который из медленного стал один из самых быстрых), CSSTree (самый быстрый детальный CSS парсер) и других.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Доклад о дизайне кода в функциональном стиле на C++, представленный вниманию плюсовиков на C++ User Group Novosibirsk 2014.
В качестве демонстрационного проекта была реализована игра "Амбер" по мотивам "Хроник Амбера" Р. Желязны.
https://github.com/graninas/Amber
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
Guava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
CSSO – инструмент для минификации CSS, который не так давно вернулся к активной разработке. Помимо исправленных багов и новых фич, он значительно ускорился и стал одним из самых быстрых структурных минификаторов CSS.
Доклад о том как это достигалось, оптимизациях, деоптимизациях, структурах данных и подходах.
Holy.js, Санкт-Петербург, 5 июня 2016
Видео: https://www.youtube.com/watch?v=8o3gKKD_J4A
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
РИТ++ 2017, Backend Conf
Зал Кейптаун, 5 июня, 14:00
Тезисы:
http://backendconf.ru/2017/abstracts/2510.html
Я расскажу об опыте разработки REST API сервиса одной рекрутинговой платформы. Стремясь найти простое и масштабируемое решение, мы выбираем PostgreSQL и Node.js, а вместо сессий используем JWT-токены. Избегая ORM, мы пишем большие и сложные, но эффективные SQL-запросы. На помощь приходят SQL-представления, триггеры и небольшая собственная JS-библиотека.
...
Очередной скучный доклад про логгированиеPython Meetup
Стас Рудаков, компания СООО "Гейм Стрим"/Wargaming.net
Значение логов очень часто недооценивается, а зря. Доклад с оживленным диспутом со всеми участниками митапа, чтобы разобраться: как, куда и зачем писать логи. Помимо этого затронут вопрос, как из логов выжать больше информации.
Слайды вебинара http://www.ptsecurity.ru/lab/webinars/#42235 :
"Каковы формальные признаки уязвимого и защищенного кода? Что такое уязвимость? Как разглядеть в коде уязвимость для атак, принадлежащих неизвестному классу? Чем уязвимости бизнес-логики отличаются от «традиционных» уязвимостей? Мы ответим на эти вопросы на вебинаре, посвященном теоретическому минимуму предметной области Application Security и практическому применению этих знаний в задачах анализа защищенности и при разработке защищенного кода"
Занимаясь разработкой интерфейсов, мы постоянно разбираемся как и что устроено. Вы задумывались, сколько времени у вас уходит на то, чтобы найти нужный фрагмент кода, который отвечает за компонент на странице? В своем докладе я покажу как это можно сделать за один клик, а так же раскрою технические детали.
Доклад о дизайне кода в функциональном стиле на C++, представленный вниманию плюсовиков на C++ User Group Novosibirsk 2014.
В качестве демонстрационного проекта была реализована игра "Амбер" по мотивам "Хроник Амбера" Р. Желязны.
https://github.com/graninas/Amber
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
Guava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
CSSO – инструмент для минификации CSS, который не так давно вернулся к активной разработке. Помимо исправленных багов и новых фич, он значительно ускорился и стал одним из самых быстрых структурных минификаторов CSS.
Доклад о том как это достигалось, оптимизациях, деоптимизациях, структурах данных и подходах.
Holy.js, Санкт-Петербург, 5 июня 2016
Видео: https://www.youtube.com/watch?v=8o3gKKD_J4A
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
РИТ++ 2017, Backend Conf
Зал Кейптаун, 5 июня, 14:00
Тезисы:
http://backendconf.ru/2017/abstracts/2510.html
Я расскажу об опыте разработки REST API сервиса одной рекрутинговой платформы. Стремясь найти простое и масштабируемое решение, мы выбираем PostgreSQL и Node.js, а вместо сессий используем JWT-токены. Избегая ORM, мы пишем большие и сложные, но эффективные SQL-запросы. На помощь приходят SQL-представления, триггеры и небольшая собственная JS-библиотека.
...
Очередной скучный доклад про логгированиеPython Meetup
Стас Рудаков, компания СООО "Гейм Стрим"/Wargaming.net
Значение логов очень часто недооценивается, а зря. Доклад с оживленным диспутом со всеми участниками митапа, чтобы разобраться: как, куда и зачем писать логи. Помимо этого затронут вопрос, как из логов выжать больше информации.
Слайды вебинара http://www.ptsecurity.ru/lab/webinars/#42235 :
"Каковы формальные признаки уязвимого и защищенного кода? Что такое уязвимость? Как разглядеть в коде уязвимость для атак, принадлежащих неизвестному классу? Чем уязвимости бизнес-логики отличаются от «традиционных» уязвимостей? Мы ответим на эти вопросы на вебинаре, посвященном теоретическому минимуму предметной области Application Security и практическому применению этих знаний в задачах анализа защищенности и при разработке защищенного кода"
Занимаясь разработкой интерфейсов, мы постоянно разбираемся как и что устроено. Вы задумывались, сколько времени у вас уходит на то, чтобы найти нужный фрагмент кода, который отвечает за компонент на странице? В своем докладе я покажу как это можно сделать за один клик, а так же раскрою технические детали.
TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means o...Iosif Itkin
Expanding the Meta-Generation of Correctness Conditions by Means of Semantic Markup
Dmitry Kondratyev, A.P. Ershov Institute of Informatics Systems, Novosibirsk
12 - 14 November 2015
Tools and Methods of Program Analysis in St. Petersburg
Go Template Toolkit, Сергей Свистунов, LazadaMail.ru Group
Доклад посвящен трансляторе шаблонов в Go-код (<a>https://github.com/go-qbit/template</a>). Получаемый шаблонизатор работает в более чем 10 раз быстрее html/template из стандартной библиотеки. Автор сделал краткий обзор синтаксиса шаблонов, сходства и различия с Perl Template Toolkit. И рассказал, как Go YACC помог описать грамматику для построения AST, и как из AST получается Go-код. Продемонстрировал, как go tool pprof помог найти неочевидные места, требующие оптимизации.
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Ivan Tsyganov
Я работаю над продуктом Max Patrol компании Positive Technologies. Кодовая база нашего проекта насчитывает более 50 тысяч строк кода. Без хороших тестов работа с таким объемом кода превратилась бы в кошмар. Многие программисты стремятся к 100% покрытию кода тестами и считают, что это избавит их от множества проблем. Я расскажу о том, с какими трудностями мы столкнулись и почему заветные 100% ничего не говорят о покрытии тестируемого кода. Я приведу примеры кода и тестов, которые показывают 100% покрытие и покажу почему это не так. Я рассмотрю как работает библиотека coverage.py и объясню почему не стоит слепо верить результатам ее работы. Так же я поделюсь идеей получения честной метрики покрытия кода тестами и представлю прототип библиотеки, в которую воплотилась эта идея.
JS Fest 2019. Владимир Агафонкин. Быстро по умолчанию: алгоритмическое мышлен...JSFestUA
Мы так сильно полагаемся на фреймворки, что уже забыли, как работают компьютеры. Когда что-то сильно тормозит и непонятно, как это решить, приходится учиться мыслить алгоритмически. Как анализировать "узкие" места в коде? Выполняет ли код лишнюю работу? Как можно достичь того же результата, делая меньше? Практикуя алгоритмическое мышление, отвечать на подобные вопросы становится гораздо легче, и рано или поздно вы научитесь писать код так, чтобы он был быстрым изначально, по умолчанию. Так что позвольте мне познакомить вас с алгоритмами еще раз, в практичном виде, применимом в вашей повседневной работе.
17. Почему Swift?
• Возможность вернуть несколько значений из
метода
18. Почему Swift?
• Возможность вернуть несколько значений из
метода
• Optionals
19. Почему Swift?
• Возможность вернуть несколько значений из
метода
• Optionals
• Защита от ошибок
20. Почему Swift?
• Возможность вернуть несколько значений из
метода
• Optionals
• Защита от ошибок
• Playgrounds
21. Почему Swift?
• Возможность вернуть несколько значений из
метода
• Optionals
• Защита от ошибок
• Playgrounds
• Полнофункциональные Enum
22. Почему Swift?
• Возможность вернуть несколько значений из
метода
• Optionals
• Защита от ошибок
• Playgrounds
• Полнофункциональные Enum
• “Сладкий” синтаксис
27. let lang = "swift"
switch (lang) {
case "swift":
28. let lang = "swift"
switch (lang) {
case "swift":
println("young")
29. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
30. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
println("wat?")
31. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
println("wat?")
case "js", "css":
32. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
println("wat?")
case "js", "css":
println("web")
33. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
println("wat?")
case "js", "css":
println("web")
default:
34. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
println("wat?")
case "js", "css":
println("web")
default:
println("java, is it you?")
35. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
println("wat?")
case "js", "css":
println("web")
default:
println("java, is it you?")
}
36. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
println("wat?")
case "js", "css":
println("web")
default:
println("java, is it you?")
}
37. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
println("wat?")
case "js", "css":
println("web")
default:
println("java, is it you?")
}
//<break> чтобы прервать
38. let lang = "swift"
switch (lang) {
case "swift":
println("young")
case let x where x.hasSuffix("#"):
println("wat?")
case "js", "css":
println("web")
default:
println("java, is it you?")
}
//<break> чтобы прервать
//<fallthrough> чтобы “провалиться”
39.
40. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
41. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
42. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
43. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
44. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
45. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
46. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
47. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
NSArray *langsArr = dict[@"langs"];
48. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
NSArray *langsArr = dict[@"langs"];
NSString *langs = nil;
49. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
NSArray *langsArr = dict[@"langs"];
NSString *langs = nil;
if ([langs isKindOfClass:[NSArray class]]) {
50. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
NSArray *langsArr = dict[@"langs"];
NSString *langs = nil;
if ([langs isKindOfClass:[NSArray class]]) {
langs = [langsArr
componentsSeparatedByString:@", "];
51. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
NSArray *langsArr = dict[@"langs"];
NSString *langs = nil;
if ([langs isKindOfClass:[NSArray class]]) {
langs = [langsArr
componentsSeparatedByString:@", "];
}
52. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
NSArray *langsArr = dict[@"langs"];
NSString *langs = nil;
if ([langs isKindOfClass:[NSArray class]]) {
langs = [langsArr
componentsSeparatedByString:@", "];
}
if (langs) {
53. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
NSArray *langsArr = dict[@"langs"];
NSString *langs = nil;
if ([langs isKindOfClass:[NSArray class]]) {
langs = [langsArr
componentsSeparatedByString:@", "];
}
if (langs) {
//…
54. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
NSArray *langsArr = dict[@"langs"];
NSString *langs = nil;
if ([langs isKindOfClass:[NSArray class]]) {
langs = [langsArr
componentsSeparatedByString:@", "];
}
if (langs) {
//…
}
55. var langsOpt = dict["langs"]?
.componentsJoinedByString?(", ")
if let langs = langsOpt {
println("langs=(langs)")
}
NSArray *langsArr = dict[@"langs"];
NSString *langs = nil;
if ([langs isKindOfClass:[NSArray class]]) {
langs = [langsArr
componentsSeparatedByString:@", "];
}
if (langs) {
//…
}
56. Инструменты языка
• Отсутствие try-catch конструкций
• Все методы в протоколах - обязательные
• Наличие ключевого слова required
• Модификаторы доступа
• Обязательная инициализация динамических
переменных в конструкторе
63. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
64. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
65. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
66. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
67. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
68. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
69. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
70. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
case .Success:
71. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
case .Success:
println("success")
72. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
case .Success:
println("success")
case .Failure:
73. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
case .Success:
println("success")
case .Failure:
println("failure")
74. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
case .Success:
println("success")
case .Failure:
println("failure")
case .Undetermined:
75. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
case .Success:
println("success")
case .Failure:
println("failure")
case .Undetermined:
println("n/a")
76. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
case .Success:
println("success")
case .Failure:
println("failure")
case .Undetermined:
println("n/a")
}
77. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
case .Success:
println("success")
case .Failure:
println("failure")
case .Undetermined:
println("n/a")
}
result = Status.fromRaw(1)! //Success
78. enum Status: Int {
case Undetermined, Success, Failure
}
func sendRequest() -> Status {
//networking magic
return Status.Success
}
var result = sendRequest()
switch result {
case .Success:
println("success")
case .Failure:
println("failure")
case .Undetermined:
println("n/a")
}
result = Status.fromRaw(1)! //Success
result.toRaw() //1
86. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
87. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
for n in a {
88. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
for n in a {
if check(n) {
89. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
for n in a {
if check(n) {
result.append(n)
90. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
for n in a {
if check(n) {
result.append(n)
}
91. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
for n in a {
if check(n) {
result.append(n)
}
}
92. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
for n in a {
if check(n) {
result.append(n)
}
}
return result
93. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
for n in a {
if check(n) {
result.append(n)
}
}
return result
}
94. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
for n in a {
if check(n) {
result.append(n)
}
}
return result
}
95. func isEven(n: Int) -> Bool {
return n % 2 == 0
}
func filter(a: [Int], check: Int -> Bool)
-> [Int] {
var result: [Int] = []
for n in a {
if check(n) {
result.append(n)
}
}
return result
}
filter(0...10, isEven)
156. “Ассоциированные” значения
• Каждый объект перечисления может
содержать объект другого типа в качестве
соответствия
• В таком случае их типы могут быть разными
• Позволяет “ассоциировать” любую
информацию
157. enum Barcode {
case UPCA(Int, Int, Int)
case PDF417(String)
}
var productBarcode = Barcode.UPCA(1, 2, 3)
productBarcode = .PDF417("ABCD")
161. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
162. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
163. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
164. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
}
165. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
}
166. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
}
// Syntax sugar
167. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
}
// Syntax sugar
switch productBarcode {
168. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
}
// Syntax sugar
switch productBarcode {
case let .UPCA(system, ident, check):
169. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
}
// Syntax sugar
switch productBarcode {
case let .UPCA(system, ident, check):
println("UPCA with value of (system), (ident), (check).")
170. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
}
// Syntax sugar
switch productBarcode {
case let .UPCA(system, ident, check):
println("UPCA with value of (system), (ident), (check).")
case let .PDF417(code):
171. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
}
// Syntax sugar
switch productBarcode {
case let .UPCA(system, ident, check):
println("UPCA with value of (system), (ident), (check).")
case let .PDF417(code):
println("PDF417 with value of (code).")
172. Ассоциированные значения доступны
в switch-case конструкции
switch productBarcode {
case .UPCA(let system, let ident, let check):
println("UPCA with value of (system), (ident), (check).")
case .PDF417(let code):
println("PDF417 with value of (code).")
}
// Syntax sugar
switch productBarcode {
case let .UPCA(system, ident, check):
println("UPCA with value of (system), (ident), (check).")
case let .PDF417(code):
println("PDF417 with value of (code).")
}
173. “Замещающие” значения
• Каждый объект перечисления может быть
сопоставлен с объектом другого типа
• “Замещающие” значения не меняются (в
отличие от “ассоциированных”
• Допустимые типы:
Character, String, Double, Float, Int*
174. // для Int работает auto-increment
enum Number: Int {
case One = 1, Two, Three, Four,
Five, Six, Seven, Eight, FortyTwo = 42
}
enum APIMethod: String {
case GET = "GET"
case POST = "POST"
case DELETE = "DELETE"
case PUT = "PUT"
case HEAD = "HEAD"
}
func request(method: APIMethod) {
var req = NSMutableURLRequest()
req.HTTPMethod = method.toRaw()
//...
}
182. • В существующей Objective-C codebase ->
New File - Cocoa Touch Class -> Swift ->
Configure Header
183. • В существующей Objective-C codebase ->
New File - Cocoa Touch Class -> Swift ->
Configure Header
• В созданный Bridging Header импортируем все,
что Swift должен видеть из Obj-C
#import “MyAFAPIClient.h”
184. • В существующей Objective-C codebase ->
New File - Cocoa Touch Class -> Swift ->
Configure Header
• В созданный Bridging Header импортируем все,
что Swift должен видеть из Obj-C
#import “MyAFAPIClient.h”
• Чтобы Obj-C видел из Swift импортируем
#import “ProductModuleName-Swift.h”
185. • В существующей Objective-C codebase ->
New File - Cocoa Touch Class -> Swift ->
Configure Header
• В созданный Bridging Header импортируем все,
что Swift должен видеть из Obj-C
#import “MyAFAPIClient.h”
• Чтобы Obj-C видел из Swift импортируем
#import “ProductModuleName-Swift.h”
• Открыть Swift-классы и протоколы через @objc
@objc(Venue)
class Venue {…}
186. Конвенции
//Person.h
@interface Person
@property (nonatomic, strong) NSString *name;
+ (instancetype)personWithName:(NSString *)name;
+ (instancetype)person;
@end
//MyApp-Bridging-Header.h
#import "Person.h"
//Main.swift
class Main {
var person1: Person
var person2: Person
init() {
person1 = Person(name: "Sergey")
person2 = Person()
}
}
187. Недоступны
из Swift в Obj-C
• Swift enum
• Вложенные классы
• Перегруженные операторы
• Swift Extensions (Categories)
• Функции (вне классов)
188. Недоступны
из Obj-C в Swift
• Objective-C++ (.mm)
• typedef enum -> только NS_ENUM
• id -> AnyObject?
196. • Защита от ошибок
• Модификаторы доступ
• Optionals
197. • Защита от ошибок
• Модификаторы доступ
• Optionals
• “Обновлённый“ switch-case
198. • Защита от ошибок
• Модификаторы доступ
• Optionals
• “Обновлённый“ switch-case
• Никаких try-catch - “умный” код
199. • Защита от ошибок
• Модификаторы доступ
• Optionals
• “Обновлённый“ switch-case
• Никаких try-catch - “умный” код
• Обаятельная инициализация
200. • Защита от ошибок
• Модификаторы доступ
• Optionals
• “Обновлённый“ switch-case
• Никаких try-catch - “умный” код
• Обаятельная инициализация
• Playgrounds
201. • Защита от ошибок
• Модификаторы доступ
• Optionals
• “Обновлённый“ switch-case
• Никаких try-catch - “умный” код
• Обаятельная инициализация
• Playgrounds
• “Сладкий” синтаксис
202. • Защита от ошибок
• Модификаторы доступ
• Optionals
• “Обновлённый“ switch-case
• Никаких try-catch - “умный” код
• Обаятельная инициализация
• Playgrounds
• “Сладкий” синтаксис
• Перегрузка операторов
203. • Защита от ошибок
• Модификаторы доступ
• Optionals
• “Обновлённый“ switch-case
• Никаких try-catch - “умный” код
• Обаятельная инициализация
• Playgrounds
• “Сладкий” синтаксис
• Перегрузка операторов
• Совместимость Obj-C <-> Swift