HTML Diff
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>