0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#подборки</a></p>
1
<p><a>#подборки</a></p>
2
<ul><li>26 июл 2021</li>
2
<ul><li>26 июл 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Каждую неделю мы отбираем несколько свежих материалов из англоязычного интернета. В этом выпуске - статьи о Swift, языке для iOS и macOS.</p>
4
</ul><p>Каждую неделю мы отбираем несколько свежих материалов из англоязычного интернета. В этом выпуске - статьи о Swift, языке для iOS и macOS.</p>
5
<p>В бэкграунде - программирование, французский язык, академическое рисование, капоэйра. Сейчас учит финский. Любит путешествия и Балтийское море.</p>
5
<p>В бэкграунде - программирование, французский язык, академическое рисование, капоэйра. Сейчас учит финский. Любит путешествия и Балтийское море.</p>
6
<p><strong>Зачем читать:</strong>если вы интересуетесь нейросетями или вам интересен фреймворк Metal Performance Shaders.</p>
6
<p><strong>Зачем читать:</strong>если вы интересуетесь нейросетями или вам интересен фреймворк Metal Performance Shaders.</p>
7
<p><strong>Где читать:</strong>на <a>Medium</a>.</p>
7
<p><strong>Где читать:</strong>на <a>Medium</a>.</p>
8
<p>Евгений Стефанков - разработчик под iOS и лауреат<a>Swift Student Challenge</a>2020 и 2021. Он уже давно интересуется нейронками - даже<a>написал</a>статью о том, как собрать нейросеть на Swift с нуля. В своей новой статье он показывает, как сделать ту же нейросеть быстрее с помощью фреймворка<em>Metal Performance Shaders</em>.</p>
8
<p>Евгений Стефанков - разработчик под iOS и лауреат<a>Swift Student Challenge</a>2020 и 2021. Он уже давно интересуется нейронками - даже<a>написал</a>статью о том, как собрать нейросеть на Swift с нуля. В своей новой статье он показывает, как сделать ту же нейросеть быстрее с помощью фреймворка<em>Metal Performance Shaders</em>.</p>
9
<p>Это полноценный пошаговый гайд - весь процесс создания умной сетки разобран детально и скрупулёзно: от необучаемых слоёв до обучения и оценки. В конце Евгений скормил нейронке знаки хираганы - японской слоговой азбуки. Через 10 минут программа уже вовсю классифицировала японские символы - с точностью 75%. С цифрами она справилась ещё лучше - за те же 10 минут точность выросла до 98%.</p>
9
<p>Это полноценный пошаговый гайд - весь процесс создания умной сетки разобран детально и скрупулёзно: от необучаемых слоёв до обучения и оценки. В конце Евгений скормил нейронке знаки хираганы - японской слоговой азбуки. Через 10 минут программа уже вовсю классифицировала японские символы - с точностью 75%. С цифрами она справилась ещё лучше - за те же 10 минут точность выросла до 98%.</p>
10
<p>Фреймворк в несколько раз ускорил создание нейросети по сравнению со сборкой на голом Swift. И хотя нейросеть Евгения поддерживает только классификации, её довольно просто доработать напильником и заставить умничать на других задачах.</p>
10
<p>Фреймворк в несколько раз ускорил создание нейросети по сравнению со сборкой на голом Swift. И хотя нейросеть Евгения поддерживает только классификации, её довольно просто доработать напильником и заставить умничать на других задачах.</p>
11
<p><strong>Зачем читать:</strong>чтобы лучше понять, как работает диспетчеризация.</p>
11
<p><strong>Зачем читать:</strong>чтобы лучше понять, как работает диспетчеризация.</p>
12
<p><strong>Где читать:</strong>на <a>Medium</a>.</p>
12
<p><strong>Где читать:</strong>на <a>Medium</a>.</p>
13
<p>Диспетчеризация методов - какая-то тайная магия создателей языков программирования. Благодаря этому волшебству функции вызываются правильно и корректно.</p>
13
<p>Диспетчеризация методов - какая-то тайная магия создателей языков программирования. Благодаря этому волшебству функции вызываются правильно и корректно.</p>
14
<p>Существуют три главных типа диспетчеризации:</p>
14
<p>Существуют три главных типа диспетчеризации:</p>
15
<ol><li><strong>Статическая диспетчеризация</strong> - самая простая и быстрая. Она используется только для методов, которые не могут быть переопределены: Swift не тратит время на выбор нужного варианта. Явно задать статическую диспетчеризацию можно с помощью слов<em>static</em>и <em>final</em>.</li>
15
<ol><li><strong>Статическая диспетчеризация</strong> - самая простая и быстрая. Она используется только для методов, которые не могут быть переопределены: Swift не тратит время на выбор нужного варианта. Явно задать статическую диспетчеризацию можно с помощью слов<em>static</em>и <em>final</em>.</li>
16
<li><strong>Диспетчеризация с помощью координирующей таблицы</strong>(vtable) используется для ссылочных типов и помогает сохранить наследование. Работает такая диспетчеризация относительно просто: генерируется таблица с правилами - в них написано, когда и какие версии одного и того же метода запускать.</li>
16
<li><strong>Диспетчеризация с помощью координирующей таблицы</strong>(vtable) используется для ссылочных типов и помогает сохранить наследование. Работает такая диспетчеризация относительно просто: генерируется таблица с правилами - в них написано, когда и какие версии одного и того же метода запускать.</li>
17
<li><strong>Диспетчеризация сообщением.</strong>У диспетчеризации таблицей есть недостаток: имплементации метода могут меняться и добавляться во время выполнения, так что таблица, созданная во время компиляции, может оказаться неверной. Диспетчеризация сообщением решает эту проблему, создавая новую таблицу уже во время выполнения.</li>
17
<li><strong>Диспетчеризация сообщением.</strong>У диспетчеризации таблицей есть недостаток: имплементации метода могут меняться и добавляться во время выполнения, так что таблица, созданная во время компиляции, может оказаться неверной. Диспетчеризация сообщением решает эту проблему, создавая новую таблицу уже во время выполнения.</li>
18
</ol><p>Основная часть статьи - подробный гайд по типам диспетчеризации, однако автор не поскупился и бонусом накинул инструкции по работе с командами<em>dynamic</em>и <em>@objc</em>, а также с SIL-кодом.</p>
18
</ol><p>Основная часть статьи - подробный гайд по типам диспетчеризации, однако автор не поскупился и бонусом накинул инструкции по работе с командами<em>dynamic</em>и <em>@objc</em>, а также с SIL-кодом.</p>
19
<p><strong>Зачем читать:</strong>чтобы узнать о более эффективном подходе к работе с Firebase.</p>
19
<p><strong>Зачем читать:</strong>чтобы узнать о более эффективном подходе к работе с Firebase.</p>
20
<p><strong>Где читать:</strong>на <a>Medium</a>.</p>
20
<p><strong>Где читать:</strong>на <a>Medium</a>.</p>
21
<p>При работе с Firebase чаще всего создаётся специальный класс, который занимается созданием, чтением, модификацией и удалением (CRUD) объектов для репозитория. Каждый раз, когда появляется какой-то новый тип данных, нужно обновлять этот класс, дублировать все команды для нового типа. Из-за этого возникает много "рутинного" шаблонного кода.</p>
21
<p>При работе с Firebase чаще всего создаётся специальный класс, который занимается созданием, чтением, модификацией и удалением (CRUD) объектов для репозитория. Каждый раз, когда появляется какой-то новый тип данных, нужно обновлять этот класс, дублировать все команды для нового типа. Из-за этого возникает много "рутинного" шаблонного кода.</p>
22
<p>Более эффективное решение - создать базовый бэкенд-класс с помощью обобщений. Он займётся всеми новыми классами, которые пройдут фильтр. В статье разобрана минималистичная версия приложения с бэкенд-API, которую можно использовать в качестве шаблона для своих аппок под iOS.</p>
22
<p>Более эффективное решение - создать базовый бэкенд-класс с помощью обобщений. Он займётся всеми новыми классами, которые пройдут фильтр. В статье разобрана минималистичная версия приложения с бэкенд-API, которую можно использовать в качестве шаблона для своих аппок под iOS.</p>
23
<p><strong>Зачем читать:</strong>чтобы глубоко разобраться в <em>property wrappers</em>.</p>
23
<p><strong>Зачем читать:</strong>чтобы глубоко разобраться в <em>property wrappers</em>.</p>
24
<p><strong>Где читать:</strong>в блоге<a>SwiftLee</a>.</p>
24
<p><strong>Где читать:</strong>в блоге<a>SwiftLee</a>.</p>
25
<p><em>Property wrappers</em>, или обёртки свойств, - довольно новое включение в Swift, которое позволяет значительно уменьшить количество шаблонного кода. Это своего рода дополнительный слой для объекта, который определяет поведение его свойств.</p>
25
<p><em>Property wrappers</em>, или обёртки свойств, - довольно новое включение в Swift, которое позволяет значительно уменьшить количество шаблонного кода. Это своего рода дополнительный слой для объекта, который определяет поведение его свойств.</p>
26
<p>Автор статьи, Антуан ван дер Ли, - iOS-разработчик с многолетним стажем. Он объясняет, что такое<em>property wrappers,</em>и приводит понятные примеры.</p>
26
<p>Автор статьи, Антуан ван дер Ли, - iOS-разработчик с многолетним стажем. Он объясняет, что такое<em>property wrappers,</em>и приводит понятные примеры.</p>
27
<p>В каких задачах помогут property wrappers:</p>
27
<p>В каких задачах помогут property wrappers:</p>
28
<ul><li>уменьшить количество шаблонного кода;</li>
28
<ul><li>уменьшить количество шаблонного кода;</li>
29
<li>эффективнее работать со свойствами;</li>
29
<li>эффективнее работать со свойствами;</li>
30
<li>удобно получать и присваивать значения;</li>
30
<li>удобно получать и присваивать значения;</li>
31
<li>добавлять новые свойства;</li>
31
<li>добавлять новые свойства;</li>
32
<li>работать с прогнозируемым значением, основанном на обёрнутом значении;</li>
32
<li>работать с прогнозируемым значением, основанном на обёрнутом значении;</li>
33
<li>получать доступ к приватным свойствам.</li>
33
<li>получать доступ к приватным свойствам.</li>
34
</ul><p>В статье есть примеры для всех этих возможностей и хранения опционалов.</p>
34
</ul><p>В статье есть примеры для всех этих возможностей и хранения опционалов.</p>
35
<p><strong>Зачем читать:</strong>чтобы узнать о новой парадигме программирования и попробовать её в Swift.</p>
35
<p><strong>Зачем читать:</strong>чтобы узнать о новой парадигме программирования и попробовать её в Swift.</p>
36
<p><strong>Где читать:</strong>на <a>Flexiple</a>.</p>
36
<p><strong>Где читать:</strong>на <a>Flexiple</a>.</p>
37
<p><strong>Что такое функциональное реактивное программирование?</strong></p>
37
<p><strong>Что такое функциональное реактивное программирование?</strong></p>
38
<p>Вкратце: это комбинация функционального и реактивного программирования. В нём часто используются функции высшего порядка.</p>
38
<p>Вкратце: это комбинация функционального и реактивного программирования. В нём часто используются функции высшего порядка.</p>
39
<p><strong>А что такое функциональное программирование?</strong></p>
39
<p><strong>А что такое функциональное программирование?</strong></p>
40
<p>Это парадигма программирования, в основе которой лежат математические функции. Главное в этой парадигме - это скорее вычисление результата, а не пошаговые инструкции к действию.</p>
40
<p>Это парадигма программирования, в основе которой лежат математические функции. Главное в этой парадигме - это скорее вычисление результата, а не пошаговые инструкции к действию.</p>
41
<p><strong>И тогда в чём смысл реактивного программирования?</strong></p>
41
<p><strong>И тогда в чём смысл реактивного программирования?</strong></p>
42
<p>Это программирование с асинхронными потоками данных.</p>
42
<p>Это программирование с асинхронными потоками данных.</p>
43
<p><strong>А что такое поток?</strong></p>
43
<p><strong>А что такое поток?</strong></p>
44
<p>Поток - это упорядоченная во времени последовательность событий. По сути, в реактивном программировании всё: переменные, свойства, структуры данных - это потоки.</p>
44
<p>Поток - это упорядоченная во времени последовательность событий. По сути, в реактивном программировании всё: переменные, свойства, структуры данных - это потоки.</p>
45
<p>Под Swift написаны две классные библиотеки для реактивного программирования:<strong>RxSwift</strong>и <strong>RxCocoa</strong>. Первая более популярна, поэтому автор в основном говорит о ней.</p>
45
<p>Под Swift написаны две классные библиотеки для реактивного программирования:<strong>RxSwift</strong>и <strong>RxCocoa</strong>. Первая более популярна, поэтому автор в основном говорит о ней.</p>
46
<ul><li><strong>Наблюдаемое (Observables)</strong> - в этой библиотеке потоки представлены как наблюдаемые последовательности (observable sequences). Такую последовательность можно создать почти для любого объекта.</li>
46
<ul><li><strong>Наблюдаемое (Observables)</strong> - в этой библиотеке потоки представлены как наблюдаемые последовательности (observable sequences). Такую последовательность можно создать почти для любого объекта.</li>
47
<li><strong>DisposeBag</strong>- это что-то вроде сборщика мусора. DisposeBag помогает отписаться от уже ненужной последовательности.</li>
47
<li><strong>DisposeBag</strong>- это что-то вроде сборщика мусора. DisposeBag помогает отписаться от уже ненужной последовательности.</li>
48
<li><strong>Субъекты (Subjects)</strong> - особый тип последовательностей, которые можно менять динамически.</li>
48
<li><strong>Субъекты (Subjects)</strong> - особый тип последовательностей, которые можно менять динамически.</li>
49
<li><strong>Привязка (Binding)</strong> - популярный оператор для привязки значения одной последовательности к другой.</li>
49
<li><strong>Привязка (Binding)</strong> - популярный оператор для привязки значения одной последовательности к другой.</li>
50
<li><strong>Комбинирование (Combine)</strong> - оператор для комбинирования двух последовательностей.</li>
50
<li><strong>Комбинирование (Combine)</strong> - оператор для комбинирования двух последовательностей.</li>
51
</ul><p><strong>Зачем читать:</strong>чтобы эффективнее решать задачи с помощью перечислений.</p>
51
</ul><p><strong>Зачем читать:</strong>чтобы эффективнее решать задачи с помощью перечислений.</p>
52
<p><strong>Где читать:</strong>на <a>Swift by Sundell</a>.</p>
52
<p><strong>Где читать:</strong>на <a>Swift by Sundell</a>.</p>
53
<p>Перечисления (enums) очень популярны в Swift: это один из самых полезных элементов, который помогает решить многие проблемы. Но это не панацея и в ряде случаев лучше решить проблему другим способом. Пример такой проблемы - отсутствие значения.</p>
53
<p>Перечисления (enums) очень популярны в Swift: это один из самых полезных элементов, который помогает решить многие проблемы. Но это не панацея и в ряде случаев лучше решить проблему другим способом. Пример такой проблемы - отсутствие значения.</p>
54
<p>Представьте, что вы кодите приложение для подкастов и добрались до категорий. Логичное решение - создать перечисление всех возможных категорий и добавить к ним категории<em>none</em>и <em>all</em>.</p>
54
<p>Представьте, что вы кодите приложение для подкастов и добрались до категорий. Логичное решение - создать перечисление всех возможных категорий и добавить к ним категории<em>none</em>и <em>all</em>.</p>
55
<p>Но есть метод получше: для категории<em>none</em>в Swift существует специальная функция. И если сделать свойство категории<strong>опционалом</strong>, уже не придётся клепать отдельную категорию<em>none</em>. Плюс так вы сможете использовать все функции опционалов - например,<em>if let</em>. Сплошная выгода :)</p>
55
<p>Но есть метод получше: для категории<em>none</em>в Swift существует специальная функция. И если сделать свойство категории<strong>опционалом</strong>, уже не придётся клепать отдельную категорию<em>none</em>. Плюс так вы сможете использовать все функции опционалов - например,<em>if let</em>. Сплошная выгода :)</p>
56
<p>А ещё автор рассказывает, как без перечислений запрогать категорию<em>all</em>и исключения из категорий.</p>
56
<p>А ещё автор рассказывает, как без перечислений запрогать категорию<em>all</em>и исключения из категорий.</p>
57
<p><strong>Зачем читать:</strong>если у вас есть приложение на SwiftUI и вы хотите перейти с Core Data на Realm.</p>
57
<p><strong>Зачем читать:</strong>если у вас есть приложение на SwiftUI и вы хотите перейти с Core Data на Realm.</p>
58
<p><strong>Где читать:</strong>на <a>Medium</a>.</p>
58
<p><strong>Где читать:</strong>на <a>Medium</a>.</p>
59
<p>Переход с Core Data на Realm - достаточно частое явление. Если вы задумываетесь о переходе, то эта статья - для вас. Не стоит волноваться: и Core Data, и Realm работают с данными как с объектами, так что переход будет быстрым и безболезненным. Да, вам придётся внести в код несколько правок, зато вы сможете избавиться от кучи шаблонного кода.</p>
59
<p>Переход с Core Data на Realm - достаточно частое явление. Если вы задумываетесь о переходе, то эта статья - для вас. Не стоит волноваться: и Core Data, и Realm работают с данными как с объектами, так что переход будет быстрым и безболезненным. Да, вам придётся внести в код несколько правок, зато вы сможете избавиться от кучи шаблонного кода.</p>
60
<p>В своей пошаговой инструкции Эндрю Морган рассмотрел два подхода к миграции, описал весь процесс и показал, как удобнее переносить пользовательские данные.</p>
60
<p>В своей пошаговой инструкции Эндрю Морган рассмотрел два подхода к миграции, описал весь процесс и показал, как удобнее переносить пользовательские данные.</p>
61
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
61
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>