iOS Broadcast
3.32K subscribers
1.71K photos
85 videos
980 links
Подборка новостей и статей для iOS разработчиков.

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Переворачиваем вечный SwiftUI календарь при помощи UIKit
Специально для вас сделал демо проект с которым можно переворачивать календарь прямо на своем телефоне
👉 70 строк кода
👉 UIPageViewController
👉 Всего 2 инстанса и полный реюз 3 сентября

#swift #swiftUI #UIKit #humor
👍31👎10
Потокобезопасность swift через - lock

Многие считают что Swift Concurrency это наше все и чтобы достичь потокобезопасности нужно использовать акторы. Это правильный ход мышления, но не всегда применимый. Для кейсов где Structured concurrency не подходит Apple добавили в iOS 16 OSAllocatedUnfairLock.
В приведенной статье автор приводить пример использования OSAllocatedUnfairLock и NSRecursiveLock в разрезе классической задачи хранилища в UDF

#swift #concurrency
👍7👎1
This media is not supported in your browser
VIEW IN TELEGRAM
⌨️ Продолжаем привыкать к новому доступному синтаксису Swift 5.9, 🐱SE-0380

Теперь можно использовать if в качестве выражения, например для динамического задания значения константы 🔥

#swift #evolution
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16👎1
⌨️ Продолжаем привыкать к новым возможностям Swift 5.9, 🐱 SE-0393, 🐱SE-0398 и 🐱SE-0399

В Swift 5.9 появились вариативные дженерики, которые решают важную проблему в Swift - дженерик функции для каждого набора аргументов.
Благодаря этому, например, в SwiftUI убрали лимит на 10 View 🎉.

#swift #proposal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👎1
📊 Мигрируем диаграммы на нативный Swift Charts

В этом году многие планируют поднять таргет до iOS 16 а это значит что можно мигрировать на нативный фреймворк Swift Charts.
Главное и безоговорочное преимущество - отсутствие сторонней зависимости, что позволяет уменьшить размер приложения.
Даже если ваш таргет iOS 15, уже можно планировать работу по миграции на нативные графики и включать их для пользователей на актуальных iOS, чтобы иметь обратную связь и возможность переключаться на старые графики по-небходимости

#swift #charts #migration
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👎1
🎉 Создаваем красивую документацию с помощью Swift-DocC

Внезапный инсайт с WWDC23, Apple доработала Swift-DocC так, что это теперь полноценный code-first редактор сайтов для инженеров, гораздо удобнее папок с .md файлами

➡️ Live preview документации
➡️ Шаблоны документации с темами и табличная верстка ‼️
➡️ Группировка по темам документации всего фреймворка
➡️ Возможность документировать расширения
➡️ Навигация в вебе как в Xcode

Вот теперь думаю, переводить всю документацию на новые релльсы или начать с новой 🤔
#Swift #DocC #wwdc23
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11👎1
😀 SE-0386 новый модификатор доступа package в Swift 5.9

В нововой версии Swift 5.9, которая идет с Xcode 15 появился новый модификотор доступа - package.
Этот модификатор будет полезен для выстраивания корректных доступов в подключаемых модулях, для случая когда вы не хотите, чтобы доступ к определенной функции осуществлялся из другого модуля, а только внутри того же модуля. В целом, этот модификатор доступа похож на internal, за исключением того, что он создан для модулей.
Актуальное ранжирование модификаторов доступа:
🔘 private
🔘 fileprivate
🔘 internal
🔘 package ✔️
🔘 public
🔘 open

#swift #proposal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👎1
🐥😺 Retainable
В своем посте на хабре "Насколько Swift удобен для DSL?", я вскользь упоминал про свои снипеты assignOnWeak и методе weakify. В представленной либе, автор пошел дальше и сделал простую библиотеку для всех возможных случаев с Readme и примерами

publisher
.sink(weak(ThisClass.handle))
.store(in: &cancellables)
var userNameBinding: Binding<String> = .init(
set: unowned(\.userName),
get: unowned(\.userName)
)
networkManager.performTask(weak(
capture: (userId, chatId), ThisClass.process)
)

#weak #swift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
Переворачиваем вечный SwiftUI календарь при помощи UIKit
У этого канала своя традиция на 3 сентября😅. Специально для вас сделал демо проект с которым можно переворачивать календарь прямо на своем телефоне
👉 70 строк кода
👉 UIPageViewController
👉 Всего 2 инстанса и полный реюз 3 сентября

#swift #swiftUI #UIKit #humor
👍6
🐥 Глоссарий по параллелизму Swift

Наткнулся на годный глоссарий по Swift Concurrency. Cодержит термины, ключевые слова и аннотации, связанные с параллелизмом. Содержит тип (ключевое слово, протокол, flow control), описание, ссылку на пропоузал и пример использования. Когда это может быть полезно? Пройтись и проверить что вы знакомы со всем что нужно, объяснить коллеге понятными словами, разобраться в MR, подготовиться к собесу.
Точно достойно 🔖
#swift #concurrency #glossary
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
🐥 Swift Collections package
Каждый раз, когда я вижу в MR очередную реализацию "более эффективной" коллекции, хочется бить по рукам. Даже если есть практическая необходимость, уже есть официальный пакет с открытым исходным кодом для расширения набора коллекций Swift. Цель проекта - служить испытательным полигоном для новых структур данных, улучшить дизайн и исправить ошибки до официального включения в библиотеку. Например, есть реализации для двусторонней очереди (Deque), упорядоченного набора (OrderedSet), упорядоченного словаря (OrderedDictionary), BitSet, BitArray, Heap, TreeSet и TreeDictionary.
Особенности коллекций:

Deque:
• Упорядоченная коллекция с произвольным доступом и изменяемостью
• Поддерживает эффективные вставки и удаления с обоих концов
• Обеспечивает удобные операции по вставке и выталкиванию элементов

OrderedSet:
• Гибрид массива и набора
• Поддерживает уникальные элементы и эффективные тесты на принадлежность
• Использует массив для хранения элементов и хэш-таблицу для индексов

OrderedDictionary:
• Альтернатива словарю для эффективного доступа к элементам в различных позициях
• Вставляет новые пары ключ-значение за постоянное время
• Обеспечивает произвольный доступ к парам ключ-значение
#swift #collections
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🐥 Локализуем списки в Swift правильно

Swift предоставляет множество встроенных форматтеров, один из которых форматтер списков ListFormatter (iOS 13+). Он помогает объединять списки элементов в удобочитаемые предложения:
🟢Форматировщик списка учитывает языковой стандарт пользователя.
🟢Можно принудительно установить языковой стандарт, изменив свойство place.
🟢Форматировщик списка поддерживает массивы любого типа, но элементы должны быть представлены в виде строк.
🟢Можно использовать настраиваемые типы, соответствующие протоколу CustomizableStringConvertible.
#swift #list #formatter #listformatter
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
9
🐥 [SE-0460] Явная специализация дженериков в Swift
Продолжаю разбирать пропоузалы Swift. В этом предложении вводится новый атрибут @specialized , который позволяет в дженерик функции генерировать предварительно специализированные версии этой функции для определенных типов. Эта специализация создает пользовательскую реализацию функции, где "дженерики" заменяются определенными типами. Это позволяет оптимизировать функции, под конкретные типы: когда неспециализированная версия функции вызывается с одним из этих типов, компилятор генерирует код, который будет повторно отправлен в эти предварительно специализированные версии, если таковые имеются. Врядли это пригодится где-то кроме Foundation и специализированных фреймворков, но идея интересная.
#swift #evolution
Please open Telegram to view this post
VIEW IN TELEGRAM
🐥 Использование групп задач в Swift Concurrency
Группы задач существовали всегда, в GCD, OperationQueue и Combine. Они есть и в Swift Concurrency. Группы задач позволяют динамически запускать несколько дочерних задач и ожидать их выполнения или отмены. Группы задач используют совместную отмену и требуют проверки свойства Task.isCancelled (привет OperaionQueue). В статье на примерах рассматривается использование групп задач и оптимизация при работе с ними:
🟢Задачи добавляются с помощью функции addTask и могут иметь определенный приоритет.
🟢Группы задач выполняются в совместном пуле потоков, что позволяет оптимизировать логику приложения.
🟢Добавление задач только после завершения предыдущих задач помогает сократить потребление памяти.
🟢Функция addTaskUnlessCancelled добавляет задачу только при отсутствии отмены группы задач.

#swift #concurrency #group
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Ollama
Mattt продолжает вести блог NSHipster и я с удовольствием погружаюсь в старый добрый стиль и простоту статей. В этот раз тема актуальная - локальные LLM, на примере Ollama:
🟡Позволяет запускать большие языковые модели на Mac.
🟡Работает на основе llama.cpp, предоставляя удобное управление моделями.
🟡Использует файлы моделей для настройки поведения моделей.

📁 Преимущества локального запуска моделей:
🔘Конфиденциальность: данные не покидают устройство.
🔘Стоимость: работа 24/7 без учета времени использования.
🔘Задержка: отсутствие сетевых обращений, быстрое реагирование.
🔘Контроль: отсутствие черного ящика и цензуры.
🔘Надежность: отсутствие отключений и ограничений по квоте API.

🐥 Создание Swift приложений с помощью Ollama:
🟣Ollama предоставляет HTTP API для интеграции с другими инструментами.
🟣Мэт создал свой пакет Ollama Swift
🟣Этот пакет в первую очередь для того чтобы делать утилиты для себя
🟣Примеры реализации RAG-систем. Если для вас это новое сочетание букв-обязательно почитайте. Это способ использовать свою базу знаний при работе с LLM

#swift #llm #ollama
Please open Telegram to view this post
VIEW IN TELEGRAM
👍322
🔨 Переосмысление цветовой системы
Дизайн система? Нет, цветовая система! Очень интересный пример использования системы типов для работы с цветами:
🔵Система проектирования предоставляет цвета для фона, переднего плана и границ.
🔵Каждый цвет может находиться в четырех состояниях: обычном, зависшем, отключенном и нажатом.
🔵Исторически использовался подкласс UIColor, но он не работал с динамическими темами

Проблемы UIColor:
🔴UIColor не предназначен для создания подклассов.
🔴Отсутствие безопасности типов: любой экземпляр UIColor можно использовать где угодно.
🔴Повышение уровня кастомизации требует правильного использования цвета.

Новый подход с фантомными типами:
🟢Введены фантомные типы для обеспечения безопасности ввода на основе контекста.
🟢Определен протокол с тремя перечислениями для ролей цвета.
🟢Создана типобезопасная оболочка для UIColor, обеспечивающая правильную цветовую роль.

У автора большие ожидания от идеи системы типов в Swift, я же надеюсь что это не уйдет дальше идеи и мы останемся с текущей концепцией семантических цветов - accentColor, primary, secondary. Но сама по себе идея использования системы типов для реализации безопасного использования имеет шанс на жизнь

#swift #color #system
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔43
1️⃣2️⃣3️⃣4️⃣5️⃣ SE-0456 Добавили Span свойства в стандартныю библиотеку типов

Продолжаем разбираться с "упрощениями" в Swift. В этот раз, нас спасают от небезопасной работы с контейнерами и расширяют возможности использования новых типов Span и RawSpan в существующих контейнерах.

Мотивация
Многие типы контейнеров из стандартной библиотеки могут предоставлять прямой доступ к своему внутреннему представлению. До сих пор это можно было сделать только небезопасным способом. Стандартная библиотека предоставляет эту небезопасную функциональность с помощью функций, принимающих замыкания, таких как withUnsafeBufferPointer(), withContiguousStorageIfAvailable() и withUnsafeBytes(). У этих функций есть несколько недостатков, самый заметный из которых — использование небезопасных типов, что делает их неприемлемыми в средах с повышенными требованиями к безопасности. API, принимающие замыкания, также могут быть сложны в сочетании с новыми функциями и друг с другом. Эти проблемы решаются с помощью Span. Согласно этому предложению, совместимые типы стандартной библиотеки будут предоставлять доступ к своему внутреннему представлению через вычисляемые свойства типа Span и RawSpan.

#swift #evolution #proposals
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
iOS Broadcast
1️⃣2️⃣3️⃣4️⃣5️⃣ SE-0456 Добавили Span свойства в стандартныю библиотеку типов Продолжаем разбираться с "упрощениями" в Swift. В этот раз, нас спасают от небезопасной работы с контейнерами и расширяют возможности использования новых типов Span и RawSpan в…
🐥 Руководство по использованию unsafe в Swift
А вот и статья про то как работать с unsafe в Swift сейчас и в каких случаях это может вам понадобиться:

Когда использовать небезопасные указатели?
🔵Работа с BSD-сетями, OpenGL, POSIX.
🔵Оптимизация: создание ручного управления памятью.
🔵Низкоуровневое программирование: работа с буферами, сериализация/десериализация.
🔵Взаимодействие с Objective-C: наведение мостов между ARC и ручным управлением памятью.

Рекомендации по использованию небезопасных указателей:
🔵Минимизируйте использование небезопасных указателей.
🔵Используйте withUnsafe конструкции для корректного выделения и освобождения памяти.
🔵Проверяйте границы при арифметике указателей.
🔵Документируйте код и используйте стандартные библиотеки.
🔵Тщательно тестируйте код с использованием небезопасных указателей.

🟢Преимущества: производительность, интероперабельность, гибкость.
🔴Риски: утечки памяти, нарушение безопасности, сложность поддержки.

Выводы
🟡Использование unsafe в Swift требует высокой эффективности и контроля за управлением памятью.
🟡Важно не злоупотреблять прямыми указателями и документировать изменения.

#unsafe #swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
🐥 Более безопасный Swift: Как ~Copyable предотвращает появление скрытых ошибок

Новый протокол ~Copyable появился в Swift 5.9. Мы уже разбирали Copyable, а вот и один из примеров поользы использование: на примере разбирается, когда вы стоит использовать ~Copyable. Протокол ~Copyable делает объект "не подлежащим копированию". По умолчанию Swift автоматически добавляет этот протокол для всех типов.

#swift #copyable
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝🦢 Kotlin-to-Swift экспорт теперь работает по умолчанию [EXPERIMENTAL]

Kotlin-to-Swift экспорт позволяет удобно использовать скомпилированный для Apple таргетов код из Swift удобным образом. Изменение добавили в Kotlin 2.2.0-Beta2

Ключевые фичи:
👉 Поддержка многомодульности: каждый Kotlin модуль - отдельный Swift модуль
👉 Поддержка пакетов в коде
👉 type alias теперь доступны из Swift
👉 Улучшения в nullability с примитивными типами
👉 Вызов перегруженных функций в Kotlin из Swift кода
👉 Можно изменить имя модуля

Фича всё ещё в экспериментально режиме и для её включения надо выполнить ряд действий (подобно как раньше в XCode проект подключался KMP модуль)

#kotlin #swift #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1