SlideShare a Scribd company logo
Сметанин Иван
iOS разработчик в Почте
Learning from
Swift sources
30.10.2019
План
2
• Пройдемся по стандартной библиотеке
• Научимся реализовывать словари
• Познакомимся с forums.swift.org
Swift Standard Library
3
• Swift - Open Source (вдруг кто не знал)
• Stdlib живет в swift/stdlib/public/core
Dictionary.swift
4
Hash function
5
let name = “John Smith"
name.hashValue // Вот вам и хэш фукнция
(2800094741206366432)
Функция, преобразующая входное значение в
Integer
Коллизии
6
Коллизии
7
Open hashing
Closed hashing
(Open addressing)
(Separate chaining)
firstnamefirstname firstname
lastname
lastname
birthdate
birthdate
5
4
0
3 3
1
2
3
Open hashing
8
firstnamefirstname firstname
lastname
lastname
birthdate birthdate
5
4
0
3
1
2
3
Closed hashing
9
Элемент который мы
хотим вставить
Его позиция
по хэшу
x 3
5
4
0
6
7
3
1
2
b
a
c
d
r
s
t
3
0
0
2
2
2
4
4
Linear probing
10
Элемент, который мы
хотим вставить
Его позиция
по хэшу
x 3
5
4
0
6
7
3
1
2
b
a
c
d
r
s
t
3
0
0
2
2
2
4
4
5
4
0
6
7 x
3
1
2
b
a
c
d
r
s
t
3
0
0
2
2
2
4
4
3
Linear probing
11
Элемент, который мы
хотим вставить
Его позиция
по хэшу 5
4
0
6
7
3
1
2
b
a
c
d
r
s
t
3
0
0
2
2
2
4
4
x 3
Robin-hood hashing
12
5
4
0
6
7
3
1
2
b
a
c
d
r
x
t
3
0
0
2
2
2
3
4
s 4
Элемент, который мы
забрали из словаря в
обмен на x
Robin-hood hashing
13
Бенчмарки
14
Вставляем в Hash-table 80% от максимума
элементов (lfm 0.8)
Удаляем 10% от максимума и тут же
вставляем обратно
DIB - расстояние до начальной точки
Делаем так 50 раз и замеряем статистику на
каждой итерации
Данные: http://codecapsule.com/2013/11/11/robin-hood-hashing/
Суммируем
15
• В Swift closed hashing + linear probing
• Robin Hood hashing это прикольно, но
пользоваться можно только в Rust
• Теперь можно пройти собеседование в
Google (нет)
ArraySlice.swift
16
ArraySlice
17
var array = [0, 1, 2, 3, 4, 5]
var slice = array[1..<4]
0 1 2 3 4 5 6
Slice
“Ломтик” массива
let greeting = "Hi there! It's nice to meet you! 👋"
let endOfSentence = greeting.firstIndex(of: "!")!
let firstSentence = greeting[...endOfSentence]
label.text = firstSentence
Substring
18
let greeting = "Hi there! It's nice to meet you! 👋"
let endOfSentence = greeting.firstIndex(of: "!")!
let firstSentence = greeting[...endOfSentence]
label.text = String(firstSentence)
// String(_:Substring) копирует буфер
Substring
19
Start
Count = 13
Owner
“Hello, world!”
Hello, world!
Start
Count = 5
Owner
“world”
Capacity, reference count
Owning class
Substring
20
Hello, world!
Start
Count = 5
Owner
“world”
Capacity, reference count
Owning class
Substring
21
ContiguousArray.swift
22
let array = [1, 2, 3]
let contiguousArray = ContiguousArray([1, 2, 3])
ContiguousArray
23
Массив который хранит элементы в цельном регионе памяти
Non-Contiguous
Contiguous
24
class ShellsSortStrategy: SortStrategy {
required init(array: [User]) {
self.array = array
}
var array: [User]
func sort() {
// Тут скучный код сортировки
}
}
25
func testShellsSortBaseStrategy() {
let strategy = ShellsSortStrategy(array: array)
self.measure {
strategy.sort()
}
}
let array = [User](repeating: User(name: ""), count: 1000000)
Измеряем время исполнения
Среднее время исполнения
Замер (всего 10 за сессию)
Время текущего замера с его
отклонением от среднего
26
class ShellsSortStrategy: SortStrategy {
required init(array: [User]) {
self.array = ContiguousArray(array)
}
// Теперь у нас не просто Array
var array: ContiguousArray<User>
func sort() {
// Тут скучный код сортировки
}
}
Зачем ContiguousArray?
27
CollectionDifference.swift
28
let oldArray = ["a", "b", "c", "d"]
let newArray = ["a", "b", "d"]
let diff = newArray.difference(from: oldArray)
CollectionDifference
29
Дифф алгоритм прямо в стандартной библиотеке 😱
Просмотр изменений
for change in diff {
switch change {
case let .remove(offset, _, _):
anotherArray.remove(at: offset)
case let .insert(offset, newElement, _):
anotherArray.insert(newElement, at: offset)
}
}
CollectionDifference
30
CollectionDifference
31
var anotherArray = oldArray
// Применяем изменения #
anotherArray = anotherArray.applying(diff)!
// Теперь `anotherArray` равен `newArray`
Применение изменений
32
X A B C D
X
Y
C
D •
Старт
Текущая коллекция
Новая коллекция
Финиш
•
Правила переходов по матрице:
• Слева-направо

(удаление)
• Сверху вниз

(добавление)
• Или диагональ

(элементы совпадают)
33
X A B C D
X
Y
C
D
•
•
(0, 0)
Старт
Тут нечего делать
1 2 3 4 50
0
1
2
3
4
34
X A B C D
X
Y
C
D
•
•
(0, 0)
(1, 1)
Старт
•
Тут нечего делать
Диагональный ход, так как X и X
1 2 3 4 50
0
1
2
3
4
35
X A B C D
X
Y
C
D
•
•
(0, 0)
(1, 1)
(2, 1)
Старт
• •
Тут нечего делать
Диагональный ход, так как X и X
Идем вправо, удаление А
1 2 3 4 50
0
1
2
3
4
36
X A B C D
X
Y
C
D
•
•
(0, 0)
(1, 1)
(2, 1)
(3, 1)
Старт
• • •
Тут нечего делать
Диагональный ход, так как X и X
Идем вправо, удаление А
Идем вправо, удаление В
1 2 3 4 50
0
1
2
3
4
37
X A B C D
X
Y
C
D
•
•
(0, 0)
(1, 1)
(2, 1)
(3, 1)
(3, 2)
Старт
• • •
•
Тут нечего делать
Диагональный ход, так как X и X
Идем вправо, удаление А
Идем вправо, удаление В
Идем вниз, добавление Y
1 2 3 4 50
0
1
2
3
4
38
X A B C D
X
Y
C
D
•
•
(0, 0)
(1, 1)
(2, 1)
(3, 1)
(3, 2)
(4, 3)
Старт
• • •
•
•
Тут нечего делать
Диагональный ход, так как X и X
Идем вправо, удаление А
Идем вправо, удаление В
Идем вниз, добавление Y
Диагональ, С и С совпадают
1 2 3 4 50
0
1
2
3
4
39
X A B C D
X
Y
C
D
•
•
(0, 0)
(1, 1)
(2, 1)
(3, 1)
(3, 2)
(4, 3)
(5, 4)
Старт
Финиш
• • •
•
•
Тут нечего делать
Диагональный ход, так как X и X
Идем вправо, удаление А
Идем вправо, удаление В
Идем вниз, добавление Y
Диагональ, С и С совпадают
Диагональ, D и D совпадают
1 2 3 4 50
0
1
2
3
4
Как там с перфомансом?
40
Время
0,00
0,01
0,02
0,03
0,04
0,05
0,06
DeepDiff Differ ListDiff CollectionDifference
0,004
0,02
0,057
0,015
От 2000 элементов к 2100: 100 вставок и 200 удалений
Collection DiffableDataSource
41
Collection DiffableDataSource
42
Можно не смешивать CollectionDifference и UITableView
самому, Apple сделала это за нас
UITableViewDiffableDataSource
43
Было
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(
withIdentifier: “id",
for: indexPath
)
// и т.д
return cell
}
tableView.dataSource = self
tableView.reloadData()
UITableViewDiffableDataSource
44
// И никаких больше cellForRow

UITableViewDiffableDataSource<Section, User>(
tableView: tableView,
cellProvider: { tableView, indexPath, contact in
let cell = tableView.dequeueReusableCell(
withIdentifier: reuseIdentifier,
for: indexPath
)
cell.textLabel?.text = contact.name
return cell
}
)
Создание
UITableViewDiffableDataSource
45
var snapshot = NSDiffableDataSourceSnapshot<Section, User>()
snapshot.appendSections(Section.allCases)
snapshot.appendItems(userList, toSection: .users)
dataSource.apply(
snapshot,
animatingDifferences: animate,
completion: nil
)
Изменение
46
TV Shows
Search
Next to watch
Popular on Netflix
100
%
9:41
Суммируем
47
• ArraySlice/Substring нужны чтобы не копировать каждый
раз строки и их лучше не хранить слишком долго
• ContiguousArray может помочь сэкономить время
исполнения
• CollectionDifference можно взять вместо очередной
библиотеки, но iOS 13+
• UITableViewDiffableDataSource очень круто, но тоже iOS
13+
forums.swift.org
48
forums.swift.org
49
• Это как programmersforum.ru на
максималках и про Swift
• Можно поучаствовать в развитии языка
• Или спросить очередной SO вопрос
forums.swift.org
50Ссылочка
forums.swift.org
51
Cсылочка: https://forums.swift.org/t/class-and-final-class-between-swift-4-2-and-swift-5-performance/21804
52
class ShellsSortStrategy: SortStrategy {
required init(array: [Int]) {
self.array = ContiguousArray(array)
}
var array: ContiguousArray<Int>
func sort() {
// Тут скучный код сортировки
}
}
53
final class ShellsSortStrategy: SortStrategy {
required init(array: [Int]) {
self.array = ContiguousArray(array)
}
var array: ContiguousArray<Int>
func sort() {
// Тут скучный код сортировки
}
}
ContiguousArray
54
Базовый пример ContiguousArray Final + ContiguousArray
Иван
Сметанин
iOS разработчик в почте mail.ru
@ismetanin

More Related Content

What's hot

Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
Roman Brovko
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
Evgeny Kaziak
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Roman Brovko
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
Alexander Shigin
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
Vladimir Rudnyh
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
Python Meetup
 
Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»
SpbDotNet Community
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Fedor Lavrentyev
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.
Roman Brovko
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
Vasiliy Deynega
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаMikhail Kurnosov
 
Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.
Roman Brovko
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
Alexandr Graschenkov
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
Яковенко Кирилл
 
Лекция 5: Словари. Бинарные деревья поиска
Лекция 5: Словари. Бинарные деревья поискаЛекция 5: Словари. Бинарные деревья поиска
Лекция 5: Словари. Бинарные деревья поискаMikhail Kurnosov
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
Roman Brovko
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
Vladislav Ananev
 

What's hot (20)

Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поиска
 
Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Лекция 5: Словари. Бинарные деревья поиска
Лекция 5: Словари. Бинарные деревья поискаЛекция 5: Словари. Бинарные деревья поиска
Лекция 5: Словари. Бинарные деревья поиска
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 

Similar to Learning from Swift sources, Иван Сметанин

Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
LogeekNightUkraine
 
Scala on android
Scala on androidScala on android
Scala on android
Valeriya Atamanova
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
Pavel Egorov
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
Roman Dvornov
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
Evgeny Borisov
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
Омские ИТ-субботники
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
Mail.ru Group
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
Badoo Development
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
akrakovetsky
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
Alex Filatov
 
Java8. Innovations
Java8. InnovationsJava8. Innovations
Java8. Innovations
Nakraynikov Oleg
 
0. основы r
0. основы r0. основы r
0. основы rmsuteam
 
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
yaevents
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
Olexandra Dmytrenko
 
Kotlin на практике
Kotlin на практикеKotlin на практике
Kotlin на практике
Виталий Бендик
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
PyNSK
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
Igor Shkulipa
 

Similar to Learning from Swift sources, Иван Сметанин (20)

Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Bytecode
BytecodeBytecode
Bytecode
 
Scala on android
Scala on androidScala on android
Scala on android
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Java8. Innovations
Java8. InnovationsJava8. Innovations
Java8. Innovations
 
0. основы r
0. основы r0. основы r
0. основы r
 
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
Kotlin на практике
Kotlin на практикеKotlin на практике
Kotlin на практике
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
 

More from Mail.ru Group

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Mail.ru Group
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
Mail.ru Group
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Mail.ru Group
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Mail.ru Group
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
Mail.ru Group
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
Mail.ru Group
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Mail.ru Group
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
Mail.ru Group
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
Mail.ru Group
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
Mail.ru Group
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
Mail.ru Group
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Mail.ru Group
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Mail.ru Group
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Mail.ru Group
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Mail.ru Group
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Mail.ru Group
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Mail.ru Group
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Mail.ru Group
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Mail.ru Group
 

More from Mail.ru Group (20)

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
 

Learning from Swift sources, Иван Сметанин

  • 1. Сметанин Иван iOS разработчик в Почте Learning from Swift sources 30.10.2019
  • 2. План 2 • Пройдемся по стандартной библиотеке • Научимся реализовывать словари • Познакомимся с forums.swift.org
  • 3. Swift Standard Library 3 • Swift - Open Source (вдруг кто не знал) • Stdlib живет в swift/stdlib/public/core
  • 5. Hash function 5 let name = “John Smith" name.hashValue // Вот вам и хэш фукнция (2800094741206366432) Функция, преобразующая входное значение в Integer
  • 10. Элемент который мы хотим вставить Его позиция по хэшу x 3 5 4 0 6 7 3 1 2 b a c d r s t 3 0 0 2 2 2 4 4 Linear probing 10
  • 11. Элемент, который мы хотим вставить Его позиция по хэшу x 3 5 4 0 6 7 3 1 2 b a c d r s t 3 0 0 2 2 2 4 4 5 4 0 6 7 x 3 1 2 b a c d r s t 3 0 0 2 2 2 4 4 3 Linear probing 11
  • 12. Элемент, который мы хотим вставить Его позиция по хэшу 5 4 0 6 7 3 1 2 b a c d r s t 3 0 0 2 2 2 4 4 x 3 Robin-hood hashing 12
  • 13. 5 4 0 6 7 3 1 2 b a c d r x t 3 0 0 2 2 2 3 4 s 4 Элемент, который мы забрали из словаря в обмен на x Robin-hood hashing 13
  • 14. Бенчмарки 14 Вставляем в Hash-table 80% от максимума элементов (lfm 0.8) Удаляем 10% от максимума и тут же вставляем обратно DIB - расстояние до начальной точки Делаем так 50 раз и замеряем статистику на каждой итерации Данные: http://codecapsule.com/2013/11/11/robin-hood-hashing/
  • 15. Суммируем 15 • В Swift closed hashing + linear probing • Robin Hood hashing это прикольно, но пользоваться можно только в Rust • Теперь можно пройти собеседование в Google (нет)
  • 17. ArraySlice 17 var array = [0, 1, 2, 3, 4, 5] var slice = array[1..<4] 0 1 2 3 4 5 6 Slice “Ломтик” массива
  • 18. let greeting = "Hi there! It's nice to meet you! 👋" let endOfSentence = greeting.firstIndex(of: "!")! let firstSentence = greeting[...endOfSentence] label.text = firstSentence Substring 18
  • 19. let greeting = "Hi there! It's nice to meet you! 👋" let endOfSentence = greeting.firstIndex(of: "!")! let firstSentence = greeting[...endOfSentence] label.text = String(firstSentence) // String(_:Substring) копирует буфер Substring 19
  • 20. Start Count = 13 Owner “Hello, world!” Hello, world! Start Count = 5 Owner “world” Capacity, reference count Owning class Substring 20
  • 21. Hello, world! Start Count = 5 Owner “world” Capacity, reference count Owning class Substring 21
  • 23. let array = [1, 2, 3] let contiguousArray = ContiguousArray([1, 2, 3]) ContiguousArray 23 Массив который хранит элементы в цельном регионе памяти Non-Contiguous Contiguous
  • 24. 24 class ShellsSortStrategy: SortStrategy { required init(array: [User]) { self.array = array } var array: [User] func sort() { // Тут скучный код сортировки } }
  • 25. 25 func testShellsSortBaseStrategy() { let strategy = ShellsSortStrategy(array: array) self.measure { strategy.sort() } } let array = [User](repeating: User(name: ""), count: 1000000) Измеряем время исполнения Среднее время исполнения Замер (всего 10 за сессию) Время текущего замера с его отклонением от среднего
  • 26. 26 class ShellsSortStrategy: SortStrategy { required init(array: [User]) { self.array = ContiguousArray(array) } // Теперь у нас не просто Array var array: ContiguousArray<User> func sort() { // Тут скучный код сортировки } }
  • 29. let oldArray = ["a", "b", "c", "d"] let newArray = ["a", "b", "d"] let diff = newArray.difference(from: oldArray) CollectionDifference 29 Дифф алгоритм прямо в стандартной библиотеке 😱
  • 30. Просмотр изменений for change in diff { switch change { case let .remove(offset, _, _): anotherArray.remove(at: offset) case let .insert(offset, newElement, _): anotherArray.insert(newElement, at: offset) } } CollectionDifference 30
  • 31. CollectionDifference 31 var anotherArray = oldArray // Применяем изменения # anotherArray = anotherArray.applying(diff)! // Теперь `anotherArray` равен `newArray` Применение изменений
  • 32. 32 X A B C D X Y C D • Старт Текущая коллекция Новая коллекция Финиш • Правила переходов по матрице: • Слева-направо
 (удаление) • Сверху вниз
 (добавление) • Или диагональ
 (элементы совпадают)
  • 33. 33 X A B C D X Y C D • • (0, 0) Старт Тут нечего делать 1 2 3 4 50 0 1 2 3 4
  • 34. 34 X A B C D X Y C D • • (0, 0) (1, 1) Старт • Тут нечего делать Диагональный ход, так как X и X 1 2 3 4 50 0 1 2 3 4
  • 35. 35 X A B C D X Y C D • • (0, 0) (1, 1) (2, 1) Старт • • Тут нечего делать Диагональный ход, так как X и X Идем вправо, удаление А 1 2 3 4 50 0 1 2 3 4
  • 36. 36 X A B C D X Y C D • • (0, 0) (1, 1) (2, 1) (3, 1) Старт • • • Тут нечего делать Диагональный ход, так как X и X Идем вправо, удаление А Идем вправо, удаление В 1 2 3 4 50 0 1 2 3 4
  • 37. 37 X A B C D X Y C D • • (0, 0) (1, 1) (2, 1) (3, 1) (3, 2) Старт • • • • Тут нечего делать Диагональный ход, так как X и X Идем вправо, удаление А Идем вправо, удаление В Идем вниз, добавление Y 1 2 3 4 50 0 1 2 3 4
  • 38. 38 X A B C D X Y C D • • (0, 0) (1, 1) (2, 1) (3, 1) (3, 2) (4, 3) Старт • • • • • Тут нечего делать Диагональный ход, так как X и X Идем вправо, удаление А Идем вправо, удаление В Идем вниз, добавление Y Диагональ, С и С совпадают 1 2 3 4 50 0 1 2 3 4
  • 39. 39 X A B C D X Y C D • • (0, 0) (1, 1) (2, 1) (3, 1) (3, 2) (4, 3) (5, 4) Старт Финиш • • • • • Тут нечего делать Диагональный ход, так как X и X Идем вправо, удаление А Идем вправо, удаление В Идем вниз, добавление Y Диагональ, С и С совпадают Диагональ, D и D совпадают 1 2 3 4 50 0 1 2 3 4
  • 40. Как там с перфомансом? 40 Время 0,00 0,01 0,02 0,03 0,04 0,05 0,06 DeepDiff Differ ListDiff CollectionDifference 0,004 0,02 0,057 0,015 От 2000 элементов к 2100: 100 вставок и 200 удалений
  • 42. Collection DiffableDataSource 42 Можно не смешивать CollectionDifference и UITableView самому, Apple сделала это за нас
  • 43. UITableViewDiffableDataSource 43 Было func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell( withIdentifier: “id", for: indexPath ) // и т.д return cell } tableView.dataSource = self tableView.reloadData()
  • 44. UITableViewDiffableDataSource 44 // И никаких больше cellForRow
 UITableViewDiffableDataSource<Section, User>( tableView: tableView, cellProvider: { tableView, indexPath, contact in let cell = tableView.dequeueReusableCell( withIdentifier: reuseIdentifier, for: indexPath ) cell.textLabel?.text = contact.name return cell } ) Создание
  • 45. UITableViewDiffableDataSource 45 var snapshot = NSDiffableDataSourceSnapshot<Section, User>() snapshot.appendSections(Section.allCases) snapshot.appendItems(userList, toSection: .users) dataSource.apply( snapshot, animatingDifferences: animate, completion: nil ) Изменение
  • 46. 46 TV Shows Search Next to watch Popular on Netflix 100 % 9:41
  • 47. Суммируем 47 • ArraySlice/Substring нужны чтобы не копировать каждый раз строки и их лучше не хранить слишком долго • ContiguousArray может помочь сэкономить время исполнения • CollectionDifference можно взять вместо очередной библиотеки, но iOS 13+ • UITableViewDiffableDataSource очень круто, но тоже iOS 13+
  • 49. forums.swift.org 49 • Это как programmersforum.ru на максималках и про Swift • Можно поучаствовать в развитии языка • Или спросить очередной SO вопрос
  • 52. 52 class ShellsSortStrategy: SortStrategy { required init(array: [Int]) { self.array = ContiguousArray(array) } var array: ContiguousArray<Int> func sort() { // Тут скучный код сортировки } }
  • 53. 53 final class ShellsSortStrategy: SortStrategy { required init(array: [Int]) { self.array = ContiguousArray(array) } var array: ContiguousArray<Int> func sort() { // Тут скучный код сортировки } }