RSS Используйте свой батон - Новости и советы по разработке iOS Подписаться Useyourloaf.com/blog - это блог Мишель Ру о выпечке и еде, в котором она публикует разнообразные рецепты, советы по выпечке и кулинарные приключения. Use Your Loaf - iOS Development News & Tips useyourloaf.com RSS useyourloaf.com
Руководство по просмотру WWDC 2026 WWDC 2026 фокусируется на Liquid Glass и Apple Intelligence, начиная с Platforms State of the Union. Не чувствуйте давления учить всё сразу, так как доступно более 100 сессий, которые можно проходить в своем темпе. Для просмотра сессий рекомендуются приложение Apple Developer или YouTube; сессии обычно краткие и по существу. Swift 6.4 представляет улучшения качества жизни и новые функции, такие как FilePath и взаимодействие с Swift-C. SwiftUI включает обязательные изменения Liquid Glass, минималистичные значки меню и заметную роль вкладок, наряду с новыми API для документов и переупорядочиваемыми контейнерами. Модернизация UIKit-приложений включает адаптацию к изменяемым средам и обязательным жизненным циклам UIScene, в то время как AppKit-приложения должны использовать события управления и навигацию с клавиатуры. Xcode 27 предлагает настраиваемую панель инструментов, кодирующих агентов для таких задач, как локализация и прототипирование, а также улучшенный центр устройств. Instruments предоставляет новые режимы профилирования, включая инструмент Swift executors и инструмент Foundation Models для отладки агентских приложений. MetricKit перестроен с использованием Swift-first API для сбора метрик производительности приложений. Разработчики могут перейти на Swift Testing, при этом кодирующий помощник Xcode помогает в этом процессе. Xcode Cloud оптимизирует рабочие процессы сборки, доставки и автоматизации. SwiftData получает обновления, такие как запросы с секциями и возможность хранения Codable типов. Принципы дизайна подчеркивают цель, простоту и четкие названия, с руководством по созданию интуитивно понятных поисковых интерфейсов. Улучшения доступности включают улучшенную навигацию VoiceOver для чтения приложений и субтитры, сгенерированные ИИ. Apple Intelligence расширяет фреймворк Foundation Models, делая его открытым исходным кодом и предлагая варианты локальной обработки и Private Cloud Compute. WWDC 2026 Viewing Guide useyourloaf.com
Форматируйте Swift с помощью крючка для фиксации git Автоматическое форматирование кода Swift при фиксации в Git может быть достигнуто с помощью инструмента swift-format и хуков Git pre-commit. Xcode 16 включает в себя swift-format в свой инструментарий, который можно запустить через командную строку, например, swift format MyFile.swift. Настройка для swift-format осуществляется через файл .swift-format, который инструмент ищет в текущем каталоге и последовательных родительских каталогах. Конфигурацию по умолчанию можно сгенерировать с помощью swift format dump-configuration, изменить для определения пользовательских стилей кода и сохранить в предпочтительном месте. Хуки Git позволяют запускать пользовательские скрипты при определенных действиях, при этом хук pre-commit выполняется до завершения фиксации. Предоставленный скрипт pre-commit использует git diff для идентификации подготовленных файлов Swift (добавленных, скопированных, измененных или переименованных). Затем он запускает swift format --in-place --parallel для этих файлов, изменяя их напрямую. Поскольку форматировщик изменяет файлы, скрипт впоследствии использует git add для повторной подготовки вновь отформатированных файлов к фиксации. Этот скрипт pre-commit должен быть скопирован в каталог .git/hooks каждого репозитория и сделан исполняемым. Поскольку это хук на стороне клиента, установка необходима для каждого нового или клонированного репозитория. Проверку pre-commit можно обойти с помощью команды git commit --no-verify. Format Swift with a Git Commit Hook useyourloaf.com
Пользовательские схемы URL в SwiftUI WebKit в SwiftUI позволяет использовать пользовательские обработчики схем URL для локальных ресурсов. Это предполагает создание обработчика, соответствующего протоколу URLSchemeHandler. Метод reply в этом обработчике получает URLRequest и должен возвращать асинхронную последовательность. Эта последовательность выдаёт URLResponse и Data, или выбрасывает ошибку. Сначала извлеките URL из запроса и проверьте его схему. Затем определите файл, тип mime и загрузите данные из пакета приложения. Создайте URLResponse с деталями, такими как тип mime и длина данных. Наконец, выдайте ответ и данные, или ошибку, если возникнут проблемы. Зарегистрируйте этот пользовательский обработчик в WebPage.Configuration, используя желаемую схему URL. Используйте настроенную WebPage в WebView и загрузите пользовательский URL, чтобы отобразить локальный контент. SwiftUI Custom URL Schemes useyourloaf.com
Размеры экрана iPhone 17 Серия iPhone 17 имеет упрощенную линейку, исключая модель Plus и представляя iPhone Air. Базовый iPhone 17 и модели Pro имеют одинаковый дисплей размером 6,3 дюйма. Модель Pro Max сохраняет свой 6,9-дюймовый экран, устанавливая различные размерные опции. iPhone Air оснащен 6,5-дюймовым дисплеем и отдает приоритет тонкому дизайну. И базовый iPhone 17, и iPhone 17 Pro будут оснащены чипом A19, а модели Pro получат версию Pro. Базовый iPhone 17 включает функции, такие как ProMotion и Always-on display. Тонкий дизайн iPhone Air имеет одну 48-мегапиксельную камеру сзади. Скорости передачи USB-3 ограничены только моделями Pro. Документ описывает разрешения экрана, вставки безопасной области и другие ключевые характеристики. Руководство по скриншотам App Store останется последовательным с предыдущими годами. iPhone 17 Screen Sizes useyourloaf.com
Значение по умолчанию Swift в интерполяции строк Swift 6.2 улучшает интерполяцию строк для опциональных значений, устраняя предыдущие ограничения. Предыдущие версии выдавали предупреждения при интерполяции опционалов, предлагая использовать значение по умолчанию или String(describing:). Использование значения по умолчанию часто требует произвольной, потенциально бессмысленной замены. String(describing:) отображает "nil" для нулевых значений, что нежелательно. Swift 6.2 вводит параметр строки по умолчанию в интерполяцию, решая эту проблему. Новый синтаксис позволяет указать строку по умолчанию независимо от типа опционала, улучшая вывод. Например, (count, default: "not set") элегантно обрабатывает нулевые значения. Однако интеграция с локализованными строками по-прежнему не поддерживается. Новая функция описана в SE-0477. Это улучшение упрощает обработку опциональных значений в интерполяции строк. Ограничение с локализованными строками требует дальнейшего изучения. Swift Default Value in String Interpolations useyourloaf.com
Обработка предупреждений как ошибок в Swift Packages "Swift 6.2 вводит более тонкий контроль над предупреждениями компилятора внутри пакетов Swift. Ранее Xcode позволял рассматривать все предупреждения как ошибки или подавлять все предупреждения с помощью пользовательских флагов. Однако Swift 6.1 ввел опции для рассмотрения определенных диагностических групп как предупреждений или ошибок, таких как "-Werror DeprecatedDeclaration". Однако эти точные контроли не поддерживались в пакетах Swift до Swift 6.2.Чтобы использовать эти новые функции, разработчикам необходимо обновить версию инструментов Swift до 6.2 в файле Package.swift. Swift 6.2 предлагает новые настройки swiftSettings, такие как treatAllWarnings(as:) и treatWarning("группа", as:). Эти настройки позволяют точно настроить поведение, например, рассматривать все предупреждения как ошибки, за исключением определенной группы, такой как "DeprecatedDeclaration". Важно отметить, что эти настройки контроля предупреждений применяются только при прямой сборке пакета и игнорируются при использовании в качестве удаленной зависимости. Разработчики могут применить эти контроли ко всем целям внутри пакета, перебирая цели и добавляя желаемые настройки к их swiftSettings. Это улучшение обеспечивает большую гибкость в управлении предупреждениями и ошибками во время сборки." Treating Warnings As Errors In Swift Packages useyourloaf.com
Необработанные идентификаторы Swift Swift 6.2 вводит сырые идентификаторы, позволяя использовать символы, ранее запрещенные в именах идентификаторов. Эта функция, реализованная через SE-0451, позволяет заключать идентификаторы в обратные кавычки. Одно из ключевых применений - в тестировании Swift, где сырые идентификаторы могут устранить избыточность в именах функций тестирования. Вместо написания описательной строки для атрибута @Test и отдельного, традиционного имени функции, сырой идентификатор может служить обоими. Это делает имена функций тестирования описательными и видимыми в навигаторе тестов и отчетах. Другой полезный сценарий - для случаев перечисления, которые естественным образом соответствуют числам. Ранее требовались префиксы, чтобы избежать идентификаторов, начинающихся с цифр. С сырыми идентификаторами случаи перечисления, такие как 24 или 30, могут быть непосредственно представлены с помощью обратных кавычек. Это упрощает код, избегая искусственных префиксов для численных случаев перечисления. Хотя использование обратных кавычек может показаться несколько неудобным, оно предлагает значительное улучшение ясности и выразительности кода. Swift Raw Identifiers useyourloaf.com
Быстрые наблюдения асинхронных последовательностей для изменений состояния Swift 6.2 представляет новый тип Observations для потоковой передачи изменений состояния из Observable типов. Это полезно для сохранения состояния приложения, такого как поисковый запрос сцены и путь навигации. Автор ранее управлял этим состоянием в Codable классе SceneModel, который мог быть закодирован в JSON для сохранения.Этот SceneModel затем сохранялся и восстанавливался с использованием @SceneStorage в корневом представлении. Однако сохранение состояния зависело от мониторинга scenePhase, что было ненадежно, поскольку сцены могли завершиться до перехода в фоновый режим. До Swift 6.2 ObservableObject с @Published свойствами позволял использовать buffer и values от Combine для создания AsyncSequence для сохранения изменений состояния.С iOS 26 и Swift 6.2 тип Observations предоставляет аналогичный AsyncSequence для Observable типов. Это позволяет наблюдать за вычисляемыми свойствами, такими как JSON-представление SceneModel. Тип Observations принимает замыкание, которое возвращает наблюдаемое значение.Изменения транзакционны, что означает, что несколько синхронных обновлений наблюдаемых свойств объединяются в одно значение последовательности. Отслеживание обновлений начинается с willSet наблюдаемых свойств и завершается в следующей точке приостановки. Это позволяет автоматически сохранять состояние модели сцены при каждом изменении, не полагаясь на scenePhase. AsyncSequence из Observations выпускает начальное значение наблюдаемого свойства при подписке. Swift Observations AsyncSequence for State Changes useyourloaf.com
Доступная параллельность в пакетах Swift "Xcode 26 представляет "Доступную конкурентность" (Approachable Concurrency) в Swift 6.2, упрощая Swift Concurrency. Этот подход ставит во главу угла первоначальное выполнение кода в основном потоке, перенося работу в фоновый режим только при необходимости. Для внедрения существующим проектам необходимо настроить параметры сборки в Xcode. Новые проекты автоматически включают эту функцию, включая изоляцию акторов по умолчанию. Включение "Доступной конкурентности" открывает доступ к будущим функциям, таким как InferIsolatedConformances и NonisolatedNonsendingByDefault. Swift Packages также могут использовать эти функции, обновив swift-tools-version и настроив параметры цели. Вы можете установить изоляцию акторов по умолчанию с помощью новой опции swiftSettings в Package.swift. Чтобы включить все функции, вам также необходимо добавить флаги "enableUpcomingFeature" в настройки swift. Применение этих настроек ко всем целям в Swift Package требует добавления конкретных конфигураций в файл Package.swift. Раннее внедрение может выявить предупреждения компилятора, связанные с протоколами, такими как CodingKey. Эти проблемы, связанные с изоляцией, как ожидается, будут решены в будущем, и для них доступны обходные пути." Approachable Concurrency in Swift Packages useyourloaf.com
Добавление иконок Icon Composer в Xcode Icon Composer — это новый инструмент в Xcode 26, который помогает создавать иконки для системы дизайна Liquid Glass. Чтобы использовать Icon Composer, создайте слои переднего плана иконки в предпочитаемом инструменте дизайна, экспортируйте их как полностью непрозрачные слои SVG и импортируйте их в Icon Composer. В Icon Composer добавьте фон, настройте размеры и положение слоев, установите непрозрачность, цвет, градиенты, тени и эффекты стекла. Xcode использует один файл .icon для создания всех вариантов значков для поддерживаемых платформ. Чтобы добавить значки в проект Xcode, перетащите файл .icon на боковую панель навигатора проекта. После добавления вы можете открыть и отредактировать файл значка в Icon Composer прямо из Xcode. Убедитесь, что имя набора значков приложения в целевых настройках совпадает с именем файла значков Icon Composer без расширения .icon. К сожалению, Icon Composer не поддерживает альтернативные значки приложений, поэтому вам необходимо экспортировать и вручную добавлять файлы изображений в каталог активов. Это снижает полезность Icon Composer для альтернативных иконок приложений. Apple предоставляет ресурсы, в том числе Рекомендации по пользовательскому интерфейсу и видеоролики WWDC, чтобы узнать больше о Icon Composer и дизайне иконок приложений. Adding Icon Composer icons to Xcode useyourloaf.com
Руководство по просмотру WWDC 2025 Руководство по просмотру WWDC 2025 поможет вам спланировать сеансы, которые вы хотите посмотреть, с двумя основными темами: дизайн Liquid Glass и Интеллект Apple. Начните с сеанса «Состояние платформы» для получения обзора новинок этого года. Есть более 100 сеансов, поэтому не чувствуйте себя перегруженными - у вас есть время, чтобы научиться. Смотрите сеансы с помощью приложения Apple Developer, которое поддерживает воспроизведение, транскрипты и копирование кода. Swift 6.2 уже здесь, с обновлениями, чтобы облегчить переход к Swift Concurrency, включая одиночный поток по умолчанию» и опцию «определить основного актора». Другие важные просмотры - сеансы по UIKit, iPadOS, AppKit, watchOS и инструментам разработчика. Сеансы по дизайну Liquid Glass являются обязательными к просмотру в этом году, а также сеансы по тестированию, SwiftData, WidgetKit и дизайну. Сеансы по дизайну покрывают темы, такие как инклюзивный дизайн приложений, SF Symbols и интерактивные фрагменты дизайна. Наконец, есть платформенно-специфичные сеансы, чтобы помочь вам повысить свой дизайн. WWDC 2025 Viewing Guide useyourloaf.com
Синхронизация TipKit с CloudKit В iOS 17 компания Apple представила TipKit для отображения контекстных подсказок пользователям, который отслеживает частоту показа подсказок и события управления. В iOS 18 вы можете синхронизировать состояние TipKit с помощью CloudKit, чтобы избежать показа одних и тех же подсказок на каждом устройстве. Чтобы включить синхронизацию CloudKit, выберите цель вашего приложения в Xcode, добавьте возможность iCloud и выберите CloudKit. Затем добавьте идентификатор контейнера, заканчивающийся на ".tips", и включите возможность "Режимы фоновой работы" с "Удаленными уведомлениями". TipKit не синхронизируется с CloudKit по умолчанию, поэтому необходимо включить контейнер CloudKit при настройке хранилища данных Tips. Вы можете использовать параметр ".automatic" или передать конкретный идентификатор для настройки контейнера CloudKit. Будьте осторожны при синхронизации базы данных Core Data/SwiftData с CloudKit, так как она может использовать неверный идентификатор контейнера. Apple рекомендует использовать отдельный контейнер для синхронизации подсказок, и вы можете указать идентификатор Core Data/SwiftData первым в файле прав или установить его явно перед загрузкой постоянного хранилища. Синхронизация TipKit с CloudKit была представлена на WWDC24. Кроме того, книга о Modern Auto Layout доступна со скидкой во время распродажи WWDC25. Syncing TipKit with CloudKit useyourloaf.com
Выборка SwiftUI с необязательным выбором "Компонент picker ожидает привязку к выбору, например, к идентификатору проекта. Цикл ForEach автоматически присваивает тег каждому элементу, используя идентификатор проекта. Когда элемент pickera выбирается, привязка pickera устанавливается в идентификатор выбранного элемента. Иногда picker должен работать с не обязательной привязкой, позволяя не делать выбор. Для этого каждый элемент pickera должен быть вручную помечен не обязательным идентификатором. Модификатор tag имеет параметр, указывающий, что тег является не обязательным, который по умолчанию равен true. Чтобы включить опцию "Нет", можно добавить к pickеру текстовое представление с нулевым значением, приведенным к не обязательному идентификатору проекта. Полный picker проекта с не обязательным выбором включает опцию "Нет" и ручное пометку каждого элемента его идентификатором проекта. Привязка выбора объявляется как не обязательный идентификатор проекта. Тело pickera включает в себя метку и выбор pickera с опцией "Нет" и циклом ForEach с ручной пометкой." SwiftUI Picker With Optional Selection useyourloaf.com
Предикаты SwiftData для родительских связей Этот текст обсуждает использование предикатов SwiftData для запроса связей "родитель-потомок". Он представляет модель Project с массивом topics и модель Topic с необязательным свойством project. Чтобы запросить темы в конкретном проекте, предикат проверяет, совпадает ли topic.project?.persistentModelID с ID проекта. При запросе тем по нескольким проектам использование projects.contains непосредственно на необязательном topic.project?.persistentModelID не работает. Предлагаемое решение включает использование flatMap для безопасной распаковки опционала и последующей проверки на вхождение. В качестве альтернативы, оператор if-let может достичь того же результата, но считается менее лаконичным. Текст также предупреждает, что макросы #Predicate не могут напрямую получать доступ к свойствам через keypath с несколькими компонентами. Обходным путем является присвоение значения keypath временной переменной перед использованием ее в предикате. Эти методы крайне важны для эффективного запроса связанных данных в SwiftData с использованием предикатов. SwiftData Predicates For Parent Relationships useyourloaf.com
Модификаторы представления SwiftUI для стилизации Label и Button Статья посвящена созданию кастомных стилей для кнопок (Button) и подписей (Label) в SwiftUI, включая адаптивный стиль подписи, который переключается на вертикальную компоновку для компактных горизонтальных классов размеров, и кастомный стиль кнопки в форме капсулы с заливкой жёлтым цветом и моноширинным шрифтом. Эти стили можно применять к представлениям с помощью модификаторов .labelStyle и .buttonStyle. Однако создание расширений (extensions) для LabelStyle и ButtonStyle, позволяющих использовать более компактную форму модификатора, встречается реже. Для решения этой задачи статья предлагает расширить ButtonStyle и LabelStyle, подобно тому, как Apple определяет встроенные стили. Это включает добавление статического свойства или функции к расширению, которая возвращает экземпляр кастомного стиля. Например, стиль кнопки-капсулы может быть расширен статическим свойством capsule, которое возвращает экземпляр CapsuleButtonStyle. Это позволяет применять стиль с помощью компактной формы .buttonStyle(.capsule). Если кастомный стиль имеет параметры, например, настраиваемый цвет, расширение можно модифицировать, включив функцию, которая принимает параметр и возвращает экземпляр кастомного стиля. Это позволяет применять стиль с параметром, например, .buttonStyle(.capsule(.orange)). Статья содержит примеры расширения ButtonStyle и LabelStyle для создания удобных кастомных стилей. SwiftUI Label and Button Style View Modifiers useyourloaf.com
Область действия сочетаний клавиш SwiftUI В SwiftUI, модификатор .keyboardShortcut, появившийся в iOS 14, позволяет назначать сочетания клавиш элементам управления. Эти сочетания активируют основное действие элемента управления. Модификатор позволяет настраивать клавиши-модификаторы, отличные от стандартной клавиши Command. Типичный пример демонстрирует навигацию между представлениями с помощью сочетаний клавиш, назначенных кнопкам. Удивительно, но сочетания клавиш остаются активными, даже когда соответствующий элемент управления находится за пределами экрана. Такое поведение связано с тем, что SwiftUI выполняет обход иерархии представлений в глубину для поиска целей для сочетаний клавиш. Система отдает приоритет поиску первого подходящего элемента управления, независимо от его видимости. Это может привести к неожиданному поведению, когда элементы управления, находящиеся за пределами экрана, все еще реагируют на сочетания клавиш. Решением этой проблемы является отключение элементов управления с помощью модификатора .disabled на основе состояния представления. Это гарантирует, что сочетания клавиш активны только тогда, когда соответствующие элементы управления видны. Комментарий Курта Клифтона предоставляет дополнительный контекст. SwiftUI Keyboard Shortcut Scope useyourloaf.com
Язык доступности SwiftUI "При создании приложения для изучения языка с помощью SwiftUI, VoiceOver может неправильно произносить текст, если он находится на другом языке, чем язык устройства. Чтобы исправить это, необходимо изменить язык доступности, используемый VoiceOver. В UIKit можно установить свойство accessibilityLanguage для текстовых меток, но это недоступно в SwiftUI. Одним из предложенных решений является использование AttributedString с атрибутом accessibilitySpeechLanguage, но это не работает. Другим решением является изменение окружающей среды локали для каждого представления с помощью модификатора environment. Однако это работает только в том случае, если вы используете инициализатор verbatim для представления Text, поскольку он по умолчанию обрабатывает текст как ключ локализованной строки. Это решение работает для представлений Text, но требует более длинной формы для представлений, таких как Label. Вы можете применить локаль к метке или дочернему текстовому представлению, но если вы используете метку с иконкой, локаль вступает в силу только при применении к кнопке. Это означает, что VoiceOver будет произносить "кнопку" в измененной локали, но основной текст будет произноситься правильно. В целом, изменение окружающей среды локали для каждого представления является решением для изменения языка доступности, используемого VoiceOver в SwiftUI." SwiftUI Accessibility Language useyourloaf.com
SwiftUI Стандартная якорь прокрутки Статья обсуждает, как управлять вертикальным выравниванием контента внутри скролл-вью в SwiftUI, особенно при адаптации к динамическим размерам шрифта. Первоначально используется простой скролл-вью, чтобы разместить контент, который может превышать высоту экрана. Однако это приводит к тому, что контент выравнивается вверху, когда он меньше скролл-вью, что является нежелательным. iOS 17 ввела модификатор defaultScrollAnchor, но он не имеет нюансов, чтобы центрировать контент только тогда, когда он помещается внутри скролл-вью. iOS 18 решает эту проблему с помощью нового модификатора defaultScrollAnchor, который включает параметр role. Этот параметр позволяет разработчикам настраивать точку привязки для разных ситуаций, включая выравнивание контента, который меньше контейнера, используя .alignment. Установив привязку на .center для роли .alignment, контент центрируется, когда он помещается, и выравнивается вверху, когда превышает высоту контейнера. Два варианта модификатора представления можно использовать вместе, чтобы изменить значение по умолчанию и переопределить привязку для конкретных ролей. Новый модификатор обеспечивает более тонкий подход к управлению выравниванием контента скролл-вью на основе его размера относительно контейнера. Это гарантирует лучший пользовательский опыт, динамически регулируя вертикальное положение контента. SwiftUI Default Scroll Anchor useyourloaf.com
Тестирование обработчиков завершения в Swift Автор переносит тесты XCTest в Swift Testing, но столкнулся с проблемой при тестировании кода, который полагается на обработчики завершения. Код использует подкласс NSPersistentContainer, который загружает хранилища Core Data асинхронно с помощью обработчика завершения. В XCTest автор использовал механизм ожидания для тестирования асинхронной операции. Фреймворк XCTest предоставляет способ создания ожидания, маркировки его как выполненного и ожидания его выполнения в течение тайм-аута. Однако Swift Testing не использует ожидания, и его подтверждения не подходят для тестирования обработчиков завершения. Чтобы перенести тест, автор использует продолжение Swift, чтобы преобразовать вызов обработчика завершения в асинхронно-совместимый. Этот подход может быть использован в XCTest, убирая необходимость в ожиданиях. Недостаток этого подхода заключается в том, что неудачный вызов метода продолжения может повесить тест, и продолжение должно быть вызвано ровно один раз. Затем тест может быть легко перенесен в Swift Testing, заменив утверждения XCTest на #expect. Полученный тест использует продолжение Swift для тестирования асинхронной операции и утверждает ожидаемые результаты. Swift Testing Completion Handlers useyourloaf.com
Тап по стековым представлениям Представления VStack и HStack в SwiftUI не регистрируют автоматически нажатия на пустое пространство в своих границах. Эта проблема возникает при прикреплении жестов к представлениям контейнера; Касания регистрируются только на содержащихся представлениях. Распространенным обходным решением является добавление фонового представления для заполнения пустого пространства. Однако более эффективное решение использует модификатор 'contentShape'. Модификатор 'contentShape' позволяет указать форму, используемую для тестирования нажатия на жесты. Применение '.contentShape(Rectangle())' к внешнему VStack делает всю область мишенью для касания. Это гарантирует, что касания в любом месте в пределах VStack активируют соответствующий жест. Это решает проблему, из-за которой жесты не реагируют на нажатия на пустое пространство в контейнерных представлениях. Такой подход позволяет избежать необходимости в ненужных фоновых представлениях. Модификатор 'contentShape' предоставляет более чистое и прямое решение для обработки взаимодействия жестов в представлениях контейнера. Tapping on Stack Views useyourloaf.com
Временное Удостоверение Уведомлений Пользователя Запрос разрешения на отправку локальных уведомлений пользователя требует явного разрешения от пользователя, которое может быть выполнено путем вызова метода requestAuthorization с желаемыми параметрами. Однако это может прервать пользователя запросом на разрешение, что может не быть идеальным. Временное разрешение, введенное в iOS 12, предоставляет альтернативу, позволяющую уведомлениям доставляться тихо, не прерывая пользователя. Чтобы запросить временное разрешение, добавьте параметр .provisional к запросу на разрешение. При использовании временного разрешения уведомления доставляются в центр уведомлений с кнопками, которые позволяют пользователю оставить или отключить уведомления. Пользователь может выбрать доставку уведомлений немедленно, тихо или в рамках запланированного обзора. Временное разрешение не предоставляет полного разрешения на отображение оповещений или бейджа иконки приложения, что требует от пользователя изменить настройки уведомлений. Чтобы проверить разрешение, учитывайте временный статус при проверке статуса разрешения. Временное разрешение может быть справедливым компромиссом для большинства приложений, но в конечном счете зависит от конкретного случая использования. Проверка статуса разрешения перед отправкой уведомления является критически важной для обеспечения корректной доставки уведомлений. Provisional Authorization of User Notificatons useyourloaf.com
SwiftUI Кнопка с изображением при нажатии Чтобы изменить изображение, отображаемое кнопкой SwiftUI, когда пользователь нажимает кнопку, можно создать пользовательский стиль кнопки, который принимает заголовок и два изображения для состояний по умолчанию и при нажатии. Этот пользовательский стиль можно достичь, создав структуру, которая соответствует протоколу ButtonStyle. ButtonStyleConfiguration предоставляет доступ к метке кнопки, состоянию isPressed и роли кнопки, которые могут быть использованы для определения отображаемого изображения. В методе makeBody можно проверить конфигурацию кнопки и вернуть метку с правильным изображением на основе состояния isPressed. Затем можно использовать этот пользовательский стиль для создания конкретного типа кнопки, такого как InfoButton, который использует пользовательский стиль для отображения другого изображения при нажатии. InfoButton можно использовать в приложении, вызвав его с действием, которое будет выполнено при нажатии кнопки. Также можно добавить анимацию к пользовательскому стилю, чтобы масштабировать изображение при нажатии, используя модификатор symbolEffect. Этот подход позволяет достичь похожего эффекта конфигураций состояний кнопок UIKit в SwiftUI. Пользовательский стиль кнопки можно повторно использовать для других кнопок в приложении, что делает его удобным решением. В целом, создание пользовательского стиля кнопки - это хороший способ настроить внешний вид кнопок SwiftUI, особенно когда встроенные стили не отвечают вашим потребностям. SwiftUI Button Image When Pressed useyourloaf.com
Снижение движения анимаций Руководство по интерфейсу пользователя Apple рекомендует не добавлять движение в интерфейс пользователя без цели, поскольку это может быть отвлекающим и некомфортным для пользователей. Движение должно быть опциональным и не единственным способом передачи важной информации. Определенные типы движения, такие как колеблющиеся движения и крупные анимации, могут быть проблематичными для пользователей. Пользователи могут запросить уменьшение движения в настройках доступности устройства, что может повлиять на стандартные переходы представления. Однако для пользовательских анимаций разработчикам необходимо самостоятельно принять меры, отключив или заменив проблематичное движение. Настройку уменьшения движения можно обнаружить в представлениях SwiftUI с помощью свойства @Environment. Документация рекомендует избегать крупных анимаций, имитирующих третий измерение, когда включена настройка уменьшения движения. Чтобы отключить анимации, разработчики могут создать вычисляемые свойства, которые учитывают состояние уменьшения движения. Это можно сделать, возвращая nil для анимации, когда включена настройка уменьшения движения, что эффективно отключает анимацию. Разработчикам необходимо решить, когда и как реагировать на настройку уменьшения движения для своих собственных анимаций. Reducing Motion of Animations useyourloaf.com
Параметризованные тесты в Swift Apple представила Swift Testing на WWDC24, которая позволяет передавать аргументы функции теста с помощью параметра arguments макроса @Test. Это функциональность позволяет проводить параметризованные тесты, где функция теста вызывается один раз для каждого значения в коллекции аргументов. Навигатор тестов отображает результаты каждого запуска теста. Если передаются два аргумента, Swift Testing генерирует тестовые случаи для всех комбинаций двух аргументов. Однако существует ограничение - не более двух аргументов, и если не все комбинации необходимы, аргументы могут быть сопряжены, чтобы их спарить. Это функциональность полезна при тестировании коллекции входных аргументов, которые ожидают одного и того же результата. Она может быть особенно удобной при использовании перечисления CaseIterable для управления тестами. Автор нашел эту функциональность полезной при миграции unit-тестов на основе XCTest в Swift Testing, особенно при проверке атрибутов классов управляемых объектов Core Data. Подход Swift Testing имеет преимущества перед использованием цикла for, включая независимые тестовые случаи, которые могут запускаться параллельно, и более четкое отчет о неудачах. В целом, параметризованное тестирование в Swift Testing может упрощать и объединять тесты, делая его полезной функциональностью на практике. Swift Parameterized Testing useyourloaf.com
Переход с XCTest на Swift Testing Тестирование на Swift - это открытый фреймворк для тестирования, разработанный для Swift, представленный компанией Apple на WWDC24 и поставляемый с Xcode 16. Он использует современные функции, такие как параллельное выполнение и макросы, и поддерживает Windows и Linux, а также платформы Apple. Нет срочной причины для миграции с XCTest, но тестирование на Swift предлагает несколько преимуществ, включая возможность запуска тестов в процессе с помощью параллельного выполнения Swift, что позволяет выполнять параллельное тестирование на физических устройствах.Чтобы начать работать с тестированием на Swift, вы можете смешивать тесты XCTest и тестирования на Swift в тестовой цели, но не следует смешивать фреймворки тестирования внутри одного теста. Вы можете импортировать фреймворк тестирования на Swift, добавив "import Testing" в ваш файл теста. Apple рекомендует группировать тесты, добавляя их к типу, такому как структура или класс, и использовать метод init для настройки и завершения.Тесты тестирования на Swift - это обычные методы Swift, которые становятся тестами единиц, когда вы добавляете макрос @Test. Вы можете пометить методы тестирования как async или throws и изолировать их в акторе по мере необходимости. Атрибут @Test - это макрос, который можно расширить, чтобы увидеть реализацию.Тестирование на Swift использует макросы #expect и #require для утверждений, которые предлагают больше гибкости и информативных сообщений об ошибках, чем XCTAssert в XCTest. Макрос #expect регистрирует неудовлетворенные ожидания и продолжает тест, в то время как макрос #require - это версия, которая выбрасывает исключение и останавливает выполнение теста при ошибке.Вы также можете использовать Issue.record, чтобы вызвать сбой теста без оценки условия, аналогично XCTFail в XCTest. В целом, тестирование на Swift предлагает несколько преимуществ перед XCTest, включая улучшенную поддержку параллельного выполнения и более гибкие утверждения. Migrating XCTest to Swift Testing useyourloaf.com
Функции построения графиков в SwiftUI Charts В рамках фреймворка SwiftUI Charts в iOS 18 теперь поддерживается построение графиков функций с помощью LinePlot и AreaPlot. Эти графики принимают функции, которые отображают числа с плавающей точкой в числа с плавающей точкой. Функции могут обрабатывать неопределенные значения, возвращая Double.nan или Double.infinity. Одна функция в AreaPlot заполняет область между функцией и осью x. Две функции могут определить область между собой. Построение графиков функций помогает визуализировать данные в сравнении с ожидаемыми аппроксимациями функций. Сочетание столбчатых диаграмм с графиками функций позволяет проводить прямое сравнение. Пример демонстрирует сравнение столбчатой диаграммы с параболой с помощью как AreaPlot, так и LinePlot. Новая функция была анонсирована на WWDC24. Информация была первоначально опубликована на useyourloaf.com. SwiftUI Charts Plotting Functions useyourloaf.com
Автоматическое отслеживание характеристик В iOS 18 UIKit представляет автоматическое отслеживание свойств (trait), что исключает необходимость ручной регистрации уведомлений о изменении свойств в методах обновления макета. Эта функция поддерживается в различных методах представлений и контроллеров представлений, включая методы UIView - layoutSubviews, updatesConstraints и draw, а также методы UIViewController - viewWillLayoutSubviews и updateViewConstraints. Когда UIKit вызывает один из этих методов, он отмечает, какие свойства были доступны, и автоматически отменяет представление, когда эти свойства меняются. Это делается с помощью методов, таких как setNeedsLayout, setNeedsUpdateConstraints, setNeedsDisplay или setNeedsUpdateConfiguration. Например, в подклассе UIView, который переопределяет метод draw, доступ к свойству preferredContentSizeCategory приведет к автоматическому вызову setNeedsDisplay при изменении свойства. До iOS 18 разработчикам приходилось вручную регистрировать изменения свойств и вызывать setNeedsDisplay, чтобы вызвать новый вызов метода draw. Однако с автоматическим отслеживанием свойств этот процесс теперь обрабатывается UIKit. Эта функция упрощает процесс реагирования на изменения свойств и уменьшает количество необходимого кода. Автоматическое отслеживание свойств является значительным улучшением в iOS 18, что делает его проще для разработчиков создавать адаптивные и реагирующие пользовательские интерфейсы. Automatic Trait Tracking useyourloaf.com
SwiftUI саморегулируемые потоковые компоновки Статья объясняет, как создать макет карточки в SwiftUI с помощью UICollectionView и UICollectionViewFlowLayout. Она объясняет, как вычислить оптимальный размер для карточек, определить количество карточек в строке и столбце, и как разместить подвиды в контейнере. Статья также охватывает кэширование и как использовать пользовательский макет в вертикальном скролл-вью. SwiftUI Self-Sizing Flow Layouts useyourloaf.com
Условные метки доступности SwiftUI В iOS 18 Apple представила необязательный параметр isEnabled для различных модификаторов доступности в SwiftUI. Этот параметр позволяет разработчикам условно применять модификаторы доступности в зависимости от определенных условий. Параметр isEnabled доступен для модификаторов, таких как .accessibilityLabel, .accessibilityInputLabels, .accessibilityValue и .accessibilityHint. Эта функция полезна, когда разработчикам необходимо условно переопределять стандартное поведение доступности. Например, в списке элементов с кнопкой для переключения статуса избранного, стандартная метка доступности для действия кнопки может быть изменена в зависимости от статуса избранного. Вместо предоставления условной метки доступности разработчики могут использовать вариант модификатора с isEnabled, чтобы применять пользовательскую метку только при выполнении определенного условия. Такой подход позволяет избежать повторения и локализации стандартной метки. В приведенном примере модификатор .accessibilityLabel используется с параметром isEnabled, чтобы применить пользовательскую метку "Удалить из избранного" только тогда, когда элемент находится в избранном. Это небольшое улучшение, которое упрощает код и сокращает усилия по локализации. Введение параметра isEnabled в iOS 18 повышает гибкость модификаторов доступности в SwiftUI. Conditional SwiftUI Accessibility Labels useyourloaf.com
Размеры экрана iPhone 16 iPhone 16: Новые модели, большие экраны, улучшенные функцииApple представила линейку iPhone 16, сняв с производства модели iPhone 15 Pro и расширив базовый модельный ряд iPhone 16 за счет улучшенных функций. Модели Pro получили увеличенные экраны: iPhone 16 Pro теперь оснащен 6,3-дюймовым дисплеем, а iPhone 16 Pro Max - 6,9-дюймовым. Несмотря на увеличение размера экранов, модели Pro сохранили компактный форм-фактор за счет уменьшенных рамок. Все модели теперь оснащены кнопками "Действие" и "Управление камерой", а также чипом A18.Базовые модели iPhone 16 сохранили свой размер экрана, но по-прежнему лишены ProMotion и Always-on дисплея, сохраняя при этом алюминиевый корпус. iPhone 16 Plus имеет те же характеристики, что и iPhone 16, но с большим экраном и улучшенным временем автономной работы. Модели Pro продолжают предлагать эксклюзивные функции, такие как поддержка USB-3, дисплей ProMotion и Always-on дисплей, а также титановый корпус. Несмотря на увеличение размеров экранов, модели Pro стали немного больше, чем их предшественники.App Store Connect теперь упростил процесс, требуя только один набор скриншотов для iPhone, который может быть предназначен для 6,9-дюймового или 6,5-дюймового дисплея. В целом, линейка iPhone 16 предлагает эволюционные улучшения с более крупными экранами, расширенными функциями и изысканным дизайном. iPhone 16 Screen Sizes useyourloaf.com
Выражения SwiftData SwiftData в iOS 18 поддерживает предикатные выражения, аналогичные NSExpression в Core Data.Предикатные выражения позволяют выполнять сложные запросы и вычисления с помощью макроса #Expression из Foundation.В Core Data NSExpression позволяет выполнять агрегатные запросы, такие как поиск минимальных и максимальных значений.Предикатные выражения SwiftData могут оценивать произвольные типы данных в рамках предикатов.Например, можно найти элементы, содержащие не менее двух записей с баллом 90 или выше.Предикатные выражения SwiftData используют PredicateExpressions, которые предлагают ряд методов.Однако некоторые методы, такие как поиск максимальных значений, работают нестабильно.В настоящее время предикатные выражения SwiftData дают ограниченные преимущества по сравнению с прямым написанием предикатов.Документацию по новым функциям SwiftData можно найти на сайте разработчиков Apple.В будущих обновлениях функциональность предикатных выражений в SwiftData может быть улучшена. SwiftData Expressions useyourloaf.com
Макрос с возможностью предварительного просмотра SwiftUI 1. Макрос Previewable Apple в iOS 18 генерирует заготовки оберток для предварительного просмотра SwiftUI с привязками состояния. 2. Предварительные просмотры SwiftUI могут улучшать опыт создания видов, но часто требуют контейнерных видов с привязками состояния. 3. Макрос Previewable устраняет необходимость вручной создания оберток, объявляя свойства @State непосредственно в предварительном просмотре. 4. Макрос создает обертку, содержащую необходимые свойства состояния. 5. Чтобы использовать макрос Previewable, отметьте свойства @State в корне предварительного просмотра макросом @Previewable. 6. Макрос преобразуется в обертку, содержащую свойства состояния и вид предварительного просмотра. 7. Созданная макросом Previewable обертка похожа на вручную созданные обертки. 8. Макрос Previewable упрощает создание интерактивных предварительных просмотров SwiftUI с привязками состояния. 9. Он уменьшает количество шаблонного кода, требующегося для оберток, упрощая процесс разработки. 10. Ознакомьтесь с WWDC24 "Что нового в SwiftUI" для получения дополнительной информации о макросе Previewable и других усовершенствованиях SwiftUI. SwiftUI Previewable Macro useyourloaf.com
Отключение генерации символов ресурсов Xcode Xcode 16: Новая функция "Символы ресурсов" в каталогах ресурсовXcode 16 представляет новую функцию "Символы ресурсов" в каталогах ресурсов, которая позволяет управлять генерацией символов.Эта функция позволяет Swift-пакетам отключать генерацию символов, что ранее было невозможно.По умолчанию установлено значение "Наследованное", которое наследует настройки проекта/цели."Включить расширения" активирует генерацию символов, а "Отключить расширения" отключает ее для отдельных каталогов ресурсов в Swift-пакетах.Генерация символов создает символы Swift и Objective-C для цветов и изображений в каталоге ресурсов.По умолчанию генерация символов включена для новых проектов, но ее можно настроить в настройках проекта.Сгенерированные символы цветов являются статическими свойствами ColorResource, а символы изображений - статическими свойствами ImageResource.Также генерируются расширения фреймворка для типов SwiftUI, UIKit и AppKit, но поддержку фреймворка можно ограничить.Первая буква сгенерированных символов является строчной, даже если имя каталога ресурсов начинается с заглавной буквы.Эта функция отказа от генерации символов позволяет Swift-пакетам избежать конфликтов при генерации символов и обеспечивает более точный контроль над использованием символов ресурсов. Disabling Xcode Asset Symbol Generation useyourloaf.com
Макрос входа для пользовательских значений окружения SwiftUI Макрос Entry упрощает настройку среды SwiftUI, сокращая количество шаблонного кода. Он исключает необходимость создавать ключи окружения и расширять окружение с помощью геттеров и сеттеров. Пользователи могут напрямую расширять окружение с помощью макроса @Entry, при необходимости предоставляя значение по умолчанию. Макрос генерирует код, который обрабатывает хранение внутренних ключей и значений. Он поддерживает Transaction, ContainerValues и FocusedValues и совместим с iOS 13 и выше. Макрос используется для создания пользовательских значений окружения, предоставляя более лаконичный и упорядоченный подход по сравнению с ручной реализацией. Entry Macro for Custom SwiftUI Environment Values useyourloaf.com
Индексы SwiftData SwiftData, представленный в iOS 17, изначально не поддерживал индексацию базы данных. iOS 18 исправил этот недостаток, добавив возможность использования индексов выборки для ускорения поиска в базе данных. Core Data давно поддерживает добавление индексов выборки, которые ускоряют поиск в базе данных по определенным свойствам. В редакторе модели Core Data в Xcode вы можете добавлять индексы выборки, выбрав сущность и используя опцию "Добавить индекс выборки". Однако, несмотря на то, что iOS 18 добавил поддержку индексов выборки в SwiftData, Xcode 16 все еще выдает предупреждение о том, что индексы выборки не поддерживаются. Чтобы добавить индексы выборки SwiftData, используйте макрос #Index для указания пути к ключу для каждого индекса. Вы можете использовать макрос #Index только один раз для каждого класса модели, поэтому все индексы должны быть перечислены в одном макросе. Также можно добавлять составные индексы, которые полезны для сортировки элементов с дублирующимися свойствами. Для получения дополнительной информации обратитесь к документации WWDC24 по теме "Что нового в SwiftData". SwiftData Indexes useyourloaf.com
Переключатели и условные выражения в Swift Swift 5.9 позволяет использовать операторы if и switch в качестве выражений.Это позволяет возвращать значение из этих операторов или присваивать его переменной.Например, выражение switch можно использовать для определения последнего компонента пути URL, связанного с состоянием перечисления.Однако каждая ветвь if или каждый случай switch должен быть одним выражением.Кроме того, оператор if должен включать else и возвращать один и тот же тип из всех ветвей.Эти ограничения несколько ограничивают полезность выражений if и switch.Компилятор может потребовать указания типа в некоторых случаях.Чтобы узнать больше об этих выражениях, обратитесь к SE-0380. Swift Switch And If Expressions useyourloaf.com
Явное создание модулей в Xcode Xcode 16 представляет экспериментальную функцию «явные модули», призванную решить проблему блокировки задач сборки из-за неявных модулей. Новый подход заключается в сканировании исходных файлов Xcode для построения графа зависимостей всех модулей, что позволяет ему собирать модули с готовыми зависимостями без задержек. В настоящее время явные модули включены по умолчанию для кода на C и Objective-C, но для кода на Swift требуется экспериментальная настройка. Хронометраж сборки показывает, что явная сборка модулей начинает компилировать модули раньше, но предварительные испытания показывают, что она может быть медленнее, чем неявная сборка. Явные модули также делятся собранными модулями с отладчиком, что может сократить задержки при вычислении выражений. Эта функция все еще находится на экспериментальной стадии в Xcode 16 и может быть изменена в будущих бета-версиях. Для получения дополнительной информации обратитесь к сессии WWDC24 и статье Apple о сборке с явными зависимостями модулей. Xcode Explicitly Built Modules useyourloaf.com
Руководство по просмотру WWDC 2024 Чтобы ориентироваться в сессиях WWDC 2024, начните с выступления "Состояние платформ", которое даст общий обзор обновлений этого года. Swift 6 представляет улучшения языка и новый статический SDK для Linux. SwiftUI получает обновления, включая плавающую панель вкладок и пользовательские элементы управления. UIKit также имеет улучшения, такие как опыт запуска документа и новые анимации. iPadOS фокусируется на улучшении работы с вкладками и боковой панелью. AppKit получает новые функции, такие как API инструментов письма и плиточное размещение окон. watchOS представляет Live Activities, а tvOS поощряет миграцию приложений TVML на SwiftUI. Кроссплатформенные сессии охватывают анимацию пользовательского интерфейса и новый опыт запуска документа. Xcode 16 приносит автодополнение кода с использованием моделей на устройстве и предварительно просматриваемые макросы. Разработчики также могут извлечь выгоду из фреймворка Swift Testing и рабочих процессов Xcode Cloud. Обновления локализации и доступности включают поддержку многоязыковых клавиатур и улучшенное масштабирование динамического типа. StoreKit и покупки в приложениях получают улучшения истории транзакций и новый атрибутивный механизм рекламы, сохраняющий конфиденциальность, с помощью AdAttributionKit. WWDC 2024 Viewing Guide useyourloaf.com
Размеры экранов iPad 2024 Apple представила четыре новых модели iPad: 13-дюймовый и 11-дюймовый iPad Pro (M4), а также 13-дюймовый и 11-дюймовый iPad Air (M2).iPad Pro оснащен чипом M4, новым экраном Ultra Retina XDR OLED и камерой Face ID, расположенной в ландшафтном положении.iPad Air получил чип M2, но сохранил свой IPS-экран Liquid Retina и Touch ID.13-дюймовые модели имеют такой же размер экрана, как и предыдущие 12,9-дюймовые и 10,9-дюймовые модели, несмотря на новый формат названия.Профессиональные модели тоньше, чем Air, с 13-дюймовым размером в 5,1 мм и 11-дюймовым в 5,3 мм.Все четыре модели поддерживают Apple Pencil Pro и Apple Pencil (USB-C), а Apple Pencil первого и второго поколения уже не совместимы.10-ядерный CPU с 4 производительными ядрами и 16 ГБ RAM доступен в профессиональных моделях с хранением не менее 1 ТБ.Базовая модель iPad (10-го поколения) и iPad mini (6-го поколения) остались неизменными.Разработчикам рекомендуется загрузить скриншоты App Store для обоих 13-дюймового iPad и 12,9-дюймового iPad Pro (2-го поколения), поскольку скриншоты 13-дюймового iPad могут представлять как Pro, так и Air модели с тем же размером экрана. iPad 2024 Screen Sizes useyourloaf.com
Круговые диаграммы SwiftUI 1. Apple представляет круговые диаграммы в SwiftUI с iOS 17. 2. Круговые диаграммы создаются с помощью представления SectorMark с параметром "угол", представляющим размер каждого сектора. 3. Данные могут быть представлены как с фиксированными диапазонами, так и с динамическими значениями. 4. Секторы можно настраивать с помощью внутреннего и внешнего радиуса, а также угловых отступов. 5. Диаграммы SwiftUI предлагают широкие возможности настройки, включая радиус скругления и конфигурацию легенды. 6. Фон диаграммы можно использовать для отображения представления в центре круговой диаграммы. 7. Интерактивность можно добавить с помощью модификатора представления .chartAngleSelection и поиска выбранного сектора. 8. Выбранные секторы можно выделить, изменив их непрозрачность. 9. В фоновом режиме можно отобразить собственное представление заголовка для отображения деталей о выбранном секторе. 10. Apple предоставляет дополнительные ресурсы и примеры для изучения круговых диаграмм в SwiftUI. SwiftUI Pie Charts useyourloaf.com