SlideShare a Scribd company logo
1 of 39
Download to read offline
Зимин Александр 
azimin@me.com
1. Перегрузка операторов 
2. App groups & today extension 
3. Debug View Hierarchy и 
@IBDesignable/@IBInspectable
Перегрузка операторов
<Модификатор> operator <операция> { 
<Свойства> 
}
Модификаторы операций 
infix 
Модификатор инфикс операции 
Выполняется для двух объектов 
Пример: a + b 
prefix 
Модификатор префиксов операции 
Выполняется для одного объекта 
Пример: !flag 
postfix 
Модификатор постфиксной операции 
Выполняется для одного объекта 
Пример: i++
Свойства операций (для infix) 
Precedence (UInt8) 
Приоритет операции 
Чем больше, тем приоритетнее 
Числа от 0 до 255 
Базовое значение 100 
Associativity 
Ассоциативность операции 
Может быть left, right, none 
Assignment 
Присвоение 
Используется для операций формата = 
Только для infix операций
Приоритет 
infix operator >+ { 
precedence 40 
} 
func >+ (left: Double, right: Double) -> Double { 
return left + right 
} 
infix operator >* { 
precedence 30 
} 
func >* (left: Double, right: Double) -> Double { 
return left * right 
} 
let value = 10 >+ 5 >* 2 // 30 
let newValue = 10 >+ 5 >+ 2 error: non-associative operator 
is adjacent to operator of same precedence
Ассоциативность 
infix operator >- { 
associativity left 
} 
func >- (left: Double, right: Double) -> Double { 
return left - right 
} 
infix operator >/ { 
associativity left 
} 
func >/ (left: Double, right: Double) -> Double { 
return left / right 
} 
let nValue = 10 >- 4 >/ 2 // 3 
let anotherValue = 10 >/ 2 >- 4 // 1
infix operator **= { 
precedence 120 
assignment 
} 
func **= (inout left: Double, right: Double) -> Double { 
left = left * right 
return left / right / 2 
} 
infix operator ** { 
associativity left 
} 
func ** (left: Double, right: Double) -> Double { 
return left * right 
} 
infix operator +++ { 
associativity left 
} 
func +++ (left: Double, right: Double) -> Double { 
return left + right 
} 
var x = 3 +++ 4 ** 5 
let y = x **= 2 ** 4 
y 
x
infix operator **= { 
precedence 120 
assignment 
} 
func **= (inout left: Double, right: Double) -> Double { 
left = left * right 
return left / right / 2 
} 
infix operator ** { 
associativity left 
} 
func ** (left: Double, right: Double) -> Double { 
return left * right 
} 
infix operator +++ { 
associativity left 
} 
func +++ (left: Double, right: Double) -> Double { 
return left + right 
} 
var x = 3 +++ 4 ** 5 // 35.0 
let y = x **= 2 ** 4 
y // 70.0 
x // 70.0
Перегрузка операций для классов
struct Vector2D { 
var x = 0.0, y = 0.0 
}
func + (left: Vector2D, right: Vector2D) -> Vector2D { 
return Vector2D(x: left.x + right.x, y: left.y + right.y) 
} 
let vectorSum1 = Vector2D(x: 1.0, y: 2.0) 
let vectorSum2 = Vector2D(x: 0.5, y: -1.0) 
let vectorSum3 = vectorSum1 + vectorSum2 // {x 1.5, y 1.0}
prefix func -(vector: Vector2D) -> Vector2D { 
return Vector2D(x: -vector.x, y: -vector.y) 
} 
prefix func +(vector: Vector2D) -> Double { 
return vector.x + vector.y 
} 
let minusVector = -vectorSum3 // {x -1.5, y -1.0} 
let result = +vectorSum3 // 2.5
func += (inout left: Vector2D, right: Vector2D) { 
left = left + right 
} 
var newVector = Vector2D(x: 1.0, y: 1.0) // {x 1.0, y 1.0} 
newVector += Vector2D(x: 1.0, y: 2.0) // {x 2.0, y 3.0} 
postfix func ++ (inout vector: Vector2D) -> Vector2D { 
vector += Vector2D(x: 1.0, y: 1.0) 
return vector 
} 
newVector++ // {x 3.0, y 4.0} 
let updatedNewVector = newVector++ // {x 4.0, y 5.0}
infix operator ** { 
precedence 160 
associativity left 
} 
func ** (left: Double, right: Double) -> Double { 
return pow(left, right) 
} 
5 ** 2 * 2 // 50.0 
3 ** 5 // 243.0
Pipe-Forward Operator
func fPow(a: Double)(b: Double) -> Double { 
return pow(a, b) 
} 
fPow(2)(b: 3) // 8.0 
let powOfFive = fPow(5) // (Function) 
powOfFive(b: 3) // 125.0
infix operator |> { 
precedence 50 
associativity left 
} 
public func |> <T,U>(lhs: T, rhs: T -> U) -> U { 
return rhs(lhs) 
}
func map<S : SequenceType, T>(source: S, transform: 
(S.Generator.Element) -> T) -> [T] 
public func mappedWithTransform<S: SequenceType, T> 
(transform: (S.Generator.Element) -> T) 
(source: S) 
-> [T] 
{ 
return map(source, transform) 
}
let seqResultMultiLine = 
", ".join( 
map( 
sorted( 
filter(numbers) { $0 % 2 == 0 } 
) { $1 < $0 } 
) { $0.description })
let result = 
arr |> filteredWithPredicate { $0 % 2 == 0 } 
|> sortedByPredicate { $0 < $1 } 
|> mappedWithTransform { $0.description } 
|> String.join(", ")
App Groups & Today 
Extension
App groups 
Что такое 
Уникальный контейнер для нескольких целей (targets) 
Ограничения 
Приложения должны быть на одном аккаунте разработчика 
Контейнер должен быть включен в настройках цели 
Как устроен 
Вы можете получить путь к общей папке 
Как получить доступ 
Через NSFileManager 
С чем работает 
С NSUserDefaults
Схема при App Extension
Примеры 
var containerName = "group.alex.quotes" 
var containerUrl = 
NSFileManager.defaultManager().containerURLForSecurityApplica 
tionGroupIdentifier(containerName) // URL path to container 
let userDefaults = NSUserDefaults(suiteName: 
containerName) // User Defaults container
App extension
Схема работы App Extension
protocol NCWidgetProviding : NSObjectProtocol { 
optional func widgetPerformUpdateWithCompletionHandler 
(completionHandler: ((NCUpdateResult) -> Void)!) 
optional func widgetMarginInsetsForProposedMarginInsets 
(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets 
} 
enum NCUpdateResult : UInt { 
case NewData 
case NoData 
case Failed 
}
func widgetMarginInsetsForProposedMarginInsets 
(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets 
Что такое 
Метод запроса отступов рамки виджета 
Базовые значения 
(top: 0, left: 47, bottom: 39, right: 0) 
Для чего используется 
“Due to the design of the widget”. Некоторые виджеты у 
Apple используют этот margin. Особенно отступ снизу.
func widgetPerformUpdateWithCompletionHandler 
(completionHandler: ((NCUpdateResult) -> Void)!) 
Что такое 
Метод, срабатывающий в случайное время (вне зависимости 
открыт ли центр уведомлений или нет) 
Возвращаемый параметр 
Замыкание (блок в obj-c), в которое надо передать 
состояние данных виджета 
Для чего используется 
Чтобы делать snapshot текущего контента 
Состояния 
NewData 
NoData 
Failed
Работа с виджетом 
viewDidLoad() 
Вызывается каждый раз как вы открыли центр уведомлений 
viewWillDisappear/viewDidDisappear 
Вызываются каждый раз как ваш виджет ушел из зоны 
видимости 
viewWillAppear/viewDidAppear 
Вызываются каждый раз как ваш виджет возвращается в 
зону видимости 
Управление размером 
1. Auto layout 
2. preferredContentSize
Debug View Hierarchy 
@IBDesignable 
@IBInspectable
Практическое применение 
Debug (Debug View Hierarchy) 
Легче найти потерянные элементы 
Можно проверить верность сетки 
Custom controls (@IBDesignable/@IBInspectable) 
Вашему дизайнеру или пользователю библиотеки 
будет проще подправить UI 
Не надо каждый раз перезапускать проект
Зачем нужен Bool? 
var optionalString: String? = getString() 
optionalString?.hasPrefix("Con")
Вопросы?

More Related Content

What's hot

Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonPython Meetup
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Боремся со сложностью по-функциональному
Боремся со сложностью по-функциональномуБоремся со сложностью по-функциональному
Боремся со сложностью по-функциональномуAgile Base Camp
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвЮрий Сыровецкий
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателейDEVTYPE
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компиляторAndrew Aksyonoff
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?yiiconf
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 

What's hot (20)

Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Боремся со сложностью по-функциональному
Боремся со сложностью по-функциональномуБоремся со сложностью по-функциональному
Боремся со сложностью по-функциональному
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон Холомьёв
 
Progr labrab-6-2013 - c++ - functions
Progr labrab-6-2013 - c++ - functionsProgr labrab-6-2013 - c++ - functions
Progr labrab-6-2013 - c++ - functions
 
Scala #3
Scala #3Scala #3
Scala #3
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компилятор
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Vuejs composition API
Vuejs composition APIVuejs composition API
Vuejs composition API
 

Viewers also liked

Роман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOSРоман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOSAlexander Zimin
 
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!CocoaHeads
 
Константин Чернухо - Аккаунт-Менеджер - we've got it!
Константин Чернухо - Аккаунт-Менеджер - we've got it!Константин Чернухо - Аккаунт-Менеджер - we've got it!
Константин Чернухо - Аккаунт-Менеджер - we've got it!Alexander Zimin
 
Александр Зимин (Alexander Zimin) - Protocol-Oriented Programming
Александр Зимин (Alexander Zimin) - Protocol-Oriented ProgrammingАлександр Зимин (Alexander Zimin) - Protocol-Oriented Programming
Александр Зимин (Alexander Zimin) - Protocol-Oriented ProgrammingAlexander Zimin
 
Александр Зимин, Onboarding в мобильном приложении: первое впечатление — всё,...
Александр Зимин, Onboarding в мобильном приложении: первое впечатление — всё,...Александр Зимин, Onboarding в мобильном приложении: первое впечатление — всё,...
Александр Зимин, Onboarding в мобильном приложении: первое впечатление — всё,...Mail.ru Group
 

Viewers also liked (6)

iOS Permissions
iOS PermissionsiOS Permissions
iOS Permissions
 
Роман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOSРоман Ермолов - Отладка приложений под iOS
Роман Ермолов - Отладка приложений под iOS
 
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!Александр Зимин (Alexander Zimin) — UIViewController, откройся!
Александр Зимин (Alexander Zimin) — UIViewController, откройся!
 
Константин Чернухо - Аккаунт-Менеджер - we've got it!
Константин Чернухо - Аккаунт-Менеджер - we've got it!Константин Чернухо - Аккаунт-Менеджер - we've got it!
Константин Чернухо - Аккаунт-Менеджер - we've got it!
 
Александр Зимин (Alexander Zimin) - Protocol-Oriented Programming
Александр Зимин (Alexander Zimin) - Protocol-Oriented ProgrammingАлександр Зимин (Alexander Zimin) - Protocol-Oriented Programming
Александр Зимин (Alexander Zimin) - Protocol-Oriented Programming
 
Александр Зимин, Onboarding в мобильном приложении: первое впечатление — всё,...
Александр Зимин, Onboarding в мобильном приложении: первое впечатление — всё,...Александр Зимин, Onboarding в мобильном приложении: первое впечатление — всё,...
Александр Зимин, Onboarding в мобильном приложении: первое впечатление — всё,...
 

Similar to Cocoheads Moscow September

Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Something about Golang
Something about GolangSomething about Golang
Something about GolangAnton Arhipov
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentationIvan Filimonov
 
функции в Java script
функции в Java scriptфункции в Java script
функции в Java scriptViktor Andreev
 
Исследование графиков функций
Исследование графиков функцийИсследование графиков функций
Исследование графиков функцийОтшельник
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03Computer Science Club
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxYandex
 
лекция 3. программирование циклов
лекция 3. программирование цикловлекция 3. программирование циклов
лекция 3. программирование цикловstudent_kai
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8chashnikov
 

Similar to Cocoheads Moscow September (20)

Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
 
Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
 
лекция 1
лекция 1лекция 1
лекция 1
 
функции в Java script
функции в Java scriptфункции в Java script
функции в Java script
 
South migration
South migrationSouth migration
South migration
 
Исследование графиков функций
Исследование графиков функцийИсследование графиков функций
Исследование графиков функций
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
лекция 3. программирование циклов
лекция 3. программирование цикловлекция 3. программирование циклов
лекция 3. программирование циклов
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 

Cocoheads Moscow September

  • 2. 1. Перегрузка операторов 2. App groups & today extension 3. Debug View Hierarchy и @IBDesignable/@IBInspectable
  • 5. Модификаторы операций infix Модификатор инфикс операции Выполняется для двух объектов Пример: a + b prefix Модификатор префиксов операции Выполняется для одного объекта Пример: !flag postfix Модификатор постфиксной операции Выполняется для одного объекта Пример: i++
  • 6. Свойства операций (для infix) Precedence (UInt8) Приоритет операции Чем больше, тем приоритетнее Числа от 0 до 255 Базовое значение 100 Associativity Ассоциативность операции Может быть left, right, none Assignment Присвоение Используется для операций формата = Только для infix операций
  • 7. Приоритет infix operator >+ { precedence 40 } func >+ (left: Double, right: Double) -> Double { return left + right } infix operator >* { precedence 30 } func >* (left: Double, right: Double) -> Double { return left * right } let value = 10 >+ 5 >* 2 // 30 let newValue = 10 >+ 5 >+ 2 error: non-associative operator is adjacent to operator of same precedence
  • 8. Ассоциативность infix operator >- { associativity left } func >- (left: Double, right: Double) -> Double { return left - right } infix operator >/ { associativity left } func >/ (left: Double, right: Double) -> Double { return left / right } let nValue = 10 >- 4 >/ 2 // 3 let anotherValue = 10 >/ 2 >- 4 // 1
  • 9. infix operator **= { precedence 120 assignment } func **= (inout left: Double, right: Double) -> Double { left = left * right return left / right / 2 } infix operator ** { associativity left } func ** (left: Double, right: Double) -> Double { return left * right } infix operator +++ { associativity left } func +++ (left: Double, right: Double) -> Double { return left + right } var x = 3 +++ 4 ** 5 let y = x **= 2 ** 4 y x
  • 10. infix operator **= { precedence 120 assignment } func **= (inout left: Double, right: Double) -> Double { left = left * right return left / right / 2 } infix operator ** { associativity left } func ** (left: Double, right: Double) -> Double { return left * right } infix operator +++ { associativity left } func +++ (left: Double, right: Double) -> Double { return left + right } var x = 3 +++ 4 ** 5 // 35.0 let y = x **= 2 ** 4 y // 70.0 x // 70.0
  • 12. struct Vector2D { var x = 0.0, y = 0.0 }
  • 13. func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y) } let vectorSum1 = Vector2D(x: 1.0, y: 2.0) let vectorSum2 = Vector2D(x: 0.5, y: -1.0) let vectorSum3 = vectorSum1 + vectorSum2 // {x 1.5, y 1.0}
  • 14. prefix func -(vector: Vector2D) -> Vector2D { return Vector2D(x: -vector.x, y: -vector.y) } prefix func +(vector: Vector2D) -> Double { return vector.x + vector.y } let minusVector = -vectorSum3 // {x -1.5, y -1.0} let result = +vectorSum3 // 2.5
  • 15. func += (inout left: Vector2D, right: Vector2D) { left = left + right } var newVector = Vector2D(x: 1.0, y: 1.0) // {x 1.0, y 1.0} newVector += Vector2D(x: 1.0, y: 2.0) // {x 2.0, y 3.0} postfix func ++ (inout vector: Vector2D) -> Vector2D { vector += Vector2D(x: 1.0, y: 1.0) return vector } newVector++ // {x 3.0, y 4.0} let updatedNewVector = newVector++ // {x 4.0, y 5.0}
  • 16. infix operator ** { precedence 160 associativity left } func ** (left: Double, right: Double) -> Double { return pow(left, right) } 5 ** 2 * 2 // 50.0 3 ** 5 // 243.0
  • 18. func fPow(a: Double)(b: Double) -> Double { return pow(a, b) } fPow(2)(b: 3) // 8.0 let powOfFive = fPow(5) // (Function) powOfFive(b: 3) // 125.0
  • 19. infix operator |> { precedence 50 associativity left } public func |> <T,U>(lhs: T, rhs: T -> U) -> U { return rhs(lhs) }
  • 20. func map<S : SequenceType, T>(source: S, transform: (S.Generator.Element) -> T) -> [T] public func mappedWithTransform<S: SequenceType, T> (transform: (S.Generator.Element) -> T) (source: S) -> [T] { return map(source, transform) }
  • 21. let seqResultMultiLine = ", ".join( map( sorted( filter(numbers) { $0 % 2 == 0 } ) { $1 < $0 } ) { $0.description })
  • 22. let result = arr |> filteredWithPredicate { $0 % 2 == 0 } |> sortedByPredicate { $0 < $1 } |> mappedWithTransform { $0.description } |> String.join(", ")
  • 23. App Groups & Today Extension
  • 24. App groups Что такое Уникальный контейнер для нескольких целей (targets) Ограничения Приложения должны быть на одном аккаунте разработчика Контейнер должен быть включен в настройках цели Как устроен Вы можете получить путь к общей папке Как получить доступ Через NSFileManager С чем работает С NSUserDefaults
  • 25.
  • 27. Примеры var containerName = "group.alex.quotes" var containerUrl = NSFileManager.defaultManager().containerURLForSecurityApplica tionGroupIdentifier(containerName) // URL path to container let userDefaults = NSUserDefaults(suiteName: containerName) // User Defaults container
  • 30. protocol NCWidgetProviding : NSObjectProtocol { optional func widgetPerformUpdateWithCompletionHandler (completionHandler: ((NCUpdateResult) -> Void)!) optional func widgetMarginInsetsForProposedMarginInsets (defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets } enum NCUpdateResult : UInt { case NewData case NoData case Failed }
  • 31. func widgetMarginInsetsForProposedMarginInsets (defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets Что такое Метод запроса отступов рамки виджета Базовые значения (top: 0, left: 47, bottom: 39, right: 0) Для чего используется “Due to the design of the widget”. Некоторые виджеты у Apple используют этот margin. Особенно отступ снизу.
  • 32. func widgetPerformUpdateWithCompletionHandler (completionHandler: ((NCUpdateResult) -> Void)!) Что такое Метод, срабатывающий в случайное время (вне зависимости открыт ли центр уведомлений или нет) Возвращаемый параметр Замыкание (блок в obj-c), в которое надо передать состояние данных виджета Для чего используется Чтобы делать snapshot текущего контента Состояния NewData NoData Failed
  • 33. Работа с виджетом viewDidLoad() Вызывается каждый раз как вы открыли центр уведомлений viewWillDisappear/viewDidDisappear Вызываются каждый раз как ваш виджет ушел из зоны видимости viewWillAppear/viewDidAppear Вызываются каждый раз как ваш виджет возвращается в зону видимости Управление размером 1. Auto layout 2. preferredContentSize
  • 34.
  • 35. Debug View Hierarchy @IBDesignable @IBInspectable
  • 36. Практическое применение Debug (Debug View Hierarchy) Легче найти потерянные элементы Можно проверить верность сетки Custom controls (@IBDesignable/@IBInspectable) Вашему дизайнеру или пользователю библиотеки будет проще подправить UI Не надо каждый раз перезапускать проект
  • 37.
  • 38. Зачем нужен Bool? var optionalString: String? = getString() optionalString?.hasPrefix("Con")