iOS Roadmap - Полезное | Swift, SwiftUI, Интервью
444 subscribers
107 photos
3 videos
8 files
195 links
iOS Roadmap: Swift, SwiftUI, архитектуры, интервью. Еженедельные подборки статей и видео, плейбуки, чек-листы, решения задач с пояснениями. Полезно начинающим и практикующим iOS-разработчикам.
Download Telegram
Apple Design Awards 2026

Apple назвала 36 финалистов дизайн-премии года. Победителей объявят на WWDC 8-12 июня. Ниже будет нескольо приложений, можно взять за пример некоторые момент, авось получится стать следующим финалистом? 🔥

Guitar Wiz - соло дев из Индии написал его полностью на SwiftUI. VoiceOver проговаривает каждую струну и аккорд. Dynamic Type, Increased Contrast, Differentiate Without Color - всё из коробки. Если хочешь понять как делать accessibility правильно - вот твой референс.

Hearing Buddy - девушка с потерей слуха сделала субтитры в реальном времени. Использует Foundation Models для on-device распознавания речи. Кто забыл - это тот самый фреймворк который Apple представила в iOS 26.

Structured - планер дня, на SwiftUI. Автор встроил Foundation Models для автозаполнения задач: к примеру, ты пишешь "зубной" и он предлагает "запись к стоматологу, среда 10:00".

Detail: AI Video Editor - превращает текстовый план в сценарий телесуфлёра и сам монтирует multi-angle. Тут тоже используется Foundation Models.

Apple любит, когда используешь их новинки. Возможно стоит рассмотреть новинки этого WWDC, если хочется, чтобы твоё приложение зафичерили в сторе?

👉 Все финалисты: https://developer.apple.com/design/awards/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥2
Новые вопросы для @ios_roadmap_academy_2024_bot

Категория:"Тестирование"


• Swift Testing: параметризованные тесты через @Test(arguments:)
• Тестирование actor и @MainActor кода без deadlock в XCTest
• Memory leak detection в тестах: addTeardownBlock и weak self
• UserRepository на Core Data и SwiftData: тестирование persistence без диска
• ImageProcessor: отлов регрессий производительности в CI через XCTest
• Тестирование AsyncSequence и AsyncStream: ожидание событий и завершения
• AuthService: изоляция Keychain, UserDefaults и FileManager в unit-тестах
• SwiftUI LoginView: поведение и visual regression в одном тест файле
• Xcode Test Plans: разный запуск unit, integration и UI в СI
• PaymentService: выбор test double для каждой зависимости

Категория:"SwiftUI: Основы"


• Охват анимации в SwiftUI: withAnimation vs .animation(_:value:)
• Coordinate spaces в GeometryProxy и поведение GeometryReader
• Dependency tracking в SwiftUI body: триггеры перерендера и run loop колизии
• Модальная презентация в SwiftUI: .sheet, .fullScreenCover и DismissAction
• Coordinator в UIViewRepresentable: makeUIView, updateUIView, makeCoordinator и bridge между мирами
• Safe area в SwiftUI: safeAreaInsets, ignoresSafeArea и frame в layout pass
• Lazy-контейнеры SwiftUI: построение по требованию и точка срабатывания onAppear
• AnyView и type erasure: потеря structural identity и последствия для SwiftUI diffing
@ViewBuilder внутри: TupleView, _ConditionalContent и предел в 10 потомков

Категория:"Swift: Основы"


• Различие some и any в Swift 5.7+: opaque types vs existential containers
• Семантика inout: copy-in/copy-out и запрет захвата в @escaping closure
• Семантика @autoclosure: ленивая оценка, nil coalescing и assert
• Контракт @propertyWrapper: wrappedValue, projectedValue и dollar-prefix accessor
• Custom CodingKeys и nested container для flat-структуры из nested JSON
• String.Index, .count и Character vs Unicode.Scalar в Swift
• ArraySlice: сохранение индексов исходного Array и copy-on-write
• Автоматический synthesis Hashable и Equatable: struct, enum, class
• Иерархия KeyPath в Swift: KeyPath, WritableKeyPath, ReferenceWritableKeyPath, PartialKeyPath
• Result<Success, Failure>: map, mapError, flatMap и get() в Swift
• Ключевое слово mutating: struct, enum, class и protocol требования
• Семантика равенства AnyHashable: type identity и .base
• Tuple и protocol conformance в Swift
• Primary associated types: что добавил Swift 5.7
• Варианты try / try? / try! и контракт rethrows
• Дженерики: where-clause и same-type constraints
• Access control: private vs fileprivate vs private(set)
• Приведение типов: as? / as! / is, protocol-existential и type(of:)
• Custom Sequence: self-as-iterator и ленивые последовательности

Категория:"UIKit: Основы"


• Цикл layout в UIView: setNeedsLayout, layoutIfNeeded и layoutSubviews
• Off-screen rendering: триггеры и стоимость GPU pass
• Цикл отрисовки UIView: setNeedsDisplay() и draw(_:)
• Алгоритм hitTest(_:with:): обход subviews и условия возврата nil
• Auto Layout self-sizing: intrinsicContentSize, invalidate и systemLayoutSizeFitting
• UIScrollView: contentInset vs adjustedContentInset и автоматическое смещение contentOffset
• Идентичность через Hashable и режимы apply в NSDiffableDataSourceSnapshot
• Анализ различий UIGestureRecognizer: shouldRecognizeSimultaneouslyWith vs require(toFail:)
• Прерывание UIViewPropertyAnimator: fractionComplete и isReversed во время interactive transitions
• Порядок жизненных методов при push и модальной презентации

Эти вопросы доступны как для категории на экране "Интервью", так же будут попадаться и для дэлей.
👍5🔥41
UI обновление для mini app

Привет, в приложении уже доступен новый UI. Теперь легко и удобно отслеживать достижения, ключевые метрики и прогресс по ответам на вопросы.

Суть обновления в том, чтобы наконец-то унифицировать этот экран. Он будет и дальше докручиваться, доделываться, но теперь уже с айдентикой и понятным UI.

Если есть вопросы, предложения по Mini App - всегда можно отписать в лс. А сам Mini App доступен здесь: @ios_roadmap_academy_2024_bot
5🔥4👍2
WWDC 2026 - основные моменты

Если не хочется смотреть видео по WWDC, но хочется тезисно понять:
• Что сделали
• Где сделали
• Описание

И т.д. то вот WWDC Notes ведётся западным коммьюнити. На этом же сайте из а 2025 год есть и будет наполняться по мере выхода выпусков в этом году!
🔥32👍1
WWDC26 - Platforms State of the Union

В этом году удивляет! Мало того, что будет RAG и Температура, т.е работу с AI планируется серьзеная.

Так показали новый Xcode 27:
- Плагины место где можно будет накатить скиллы, агенты и тулзы. К примеру Гитхаб и Фигма будут уже доступны.

- Хаб для тестирования, прощай Rocket Sim? Где можно будет растянуть девайс, поменять цвета и тему и тд

- AI теперь будет сопровождать планом, как завещали лучшие LLM, ревью внутри Xcode с ароматами подпункто.

Так еще и Xcode AI теперь сможет взять и полностью протестировать: понажимать, подергать, перейти, а в конце выгрузить скриншоты и описание, что сделано!

Ну и наконец-то сломанное body в SwiftUI теперь покажет конкретное место, не прошло и 5 лет 😁🤝

Выглядит интересным 🤝
8🔥4👍2😁2
Property Wrapper @State теперь макрос

Только-что показали, что @State стала макросом и тем самым будет доступна с ios 17.

Исправили проблему, при которой @State могла вызвать конструктор сущности несколько раз.

В отличие от @StateObject с его autoclosure, у @State отсутствовало последнее и это было неоднозначно.

В ноушене про это писал, что будьте осторожны, несет за собой сайд эффект.

Теперь еще одну неприятность убрали, отлично!
🔥52👍1
ForEach из SwiftUI обзовется swipe actions

Наконец-то Apple добавили поведение свайпов: влево, вправо как у List, UICollection, UITableView, Table и для ForEach элементов, примате ленивые стеки!

Жаль это все доступно только с 27 версии. Как по мне изначально должно было быт, с 13 или хотя бы 15…
4🔥3😁2🤯1
Реинкорнация Stack Overflow

Возможно ты видел новость, что количество вопросов на Stack Overflow упало с 200к до 3862 в месяц.

Так вот, команда не сдаётся, она адаптируется. Будут делать свой сайт "API first" для агентов.

Как это работает? Цикл из четырёх шагов:
Сначала ищи. Независимо от того, планирует ли агент выполнение задачи, застрял ли он в процессе реализации или собирается выполнить действие, на которое модель не была обучена, он сначала запрашивает информацию в Stack Overflow for Agents, прежде чем тратить вычислительные ресурсы на повторный поиск уже известных решений. Если нужный ответ есть в корпусе, агент использует проверенный ответ и приступает к выполнению задачи.

Нет ответа - внеси свой. Решил проблему сам? Оформляет пост. Для этого skill файл просит сначала показать черновик человеку-оркестратору на ревью.

Проверяй чужое. Агенты и разработчики, которые пробуют решить ту же проблему после публикации, делятся информацией о том, что сработало, что пришлось изменить и при каких условиях это сработало. Именно проверка, а не создание ответов, помогает агентам заработать репутацию на Stack Overflow.

Сигналы объединяются в консенсус. Голоса, ответы и отзывы о проверке возвращаются к исходному сообщению и накапливаются вокруг него. Платформа создана для выявления консенсуса, а не единственного канонического ответа, поэтому пользователи видят, что уже было опробовано, и сами решают, что подходит именно им.

Сейчас есть Три типа постов

1. Question. Что пробовал, что не вышло, где остался затык.

2. Today I Learned. Что сломалось, что помогло, в чём корневая причина. Самый ценный тип: фиксирует ровно то, чего не было в обучении модели.

3. Blueprint. Переиспользуемый паттерн архитектуры. Планка качества максимальная: один кривой Blueprint уведёт в сторону всех, кто строит такое же.
👍5🔥42
Матрёшка из Task внутри ViewModel

Есть популярный паттерн, который выглядит знакомым многим SwiftUI разработчикам:


@MainActor
final class ArticleViewModel: ObservableObject {
@Published var isPublishing = false

func publish(_ article: Article) {
isPublishing = true

Task {
await ArticlePublisher.publish(article: article)
isPublishing = false
}
}
}


На первый взгляд вроде-бы всё нормально:
• ViewModel изолирована на MainActor
• UI состояние меняется безопасно
• async работа вынесена в Task

Но есть одно "но" и выглядит оно как Task. Кто-то сразу прикинул:"Ага, ну тут у нас просто Task, а не Task.detached и значит мы наследуем изоляцию и замыкание Task будет изолировано на MainActor!" И будет прав, достаточно типичный пример в SwiftUI разработке.

Проблема в том, что мы легко можем протащить через MainActor работу, которой этот актор вообще не нужен.

Например, ViewModel целиком помечена @MainActor, потому что хранит UI состояние и управляет навигацией, но не каждая операция внутри такой ViewModel обязана выполняться в этой изоляции.

Но как быть, если у нас ViewModel большая, скажем на 800-900 строк и одну из операций внутри неё необходимо реализовать вне текущего actor isolation? 🤔

В Swift 6.2 для такого случая есть явный инструмент - атрибут @concurrent.


Task { @concurrent in
await ArticlePublisher.publish(article: article)

await MainActor.run {
isPublishing = false
}
}


Что здесь происходит:
@concurrent говорит замыканию Task не наследовать текущую actor isolation
• Вызов публикации больше не стартует в MainActor изоляции ViewModel
MainActor.run используется только там, где реально нужно обновить UI состояние

То есть мы не таскаем всю операцию через главный актор просто потому, что вся ViewModel помечена @MainActor. И @concurrent нужен как раз для случаев, когда мы хотим явно сказать:

Эту async работу не нужно выполнять в текущей actor isolation

Тем самым ближе познакомились с достаточно частым кейсом, сейчас / в будущем, где нам может понадобиться новый атрибут! 😎️️️️️️

Вдохновился и видоизменил под +1 кейс от Unexpected Task suspension points in Swift Concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65🔥5
#miniapp #обновление

Привет, в mini app обновление - расширил источник вакансий. Теперь есть небольшой количество вакансий из Linkedln, совсем немного 10-15шт удалось подтянуть.

Буду так же смотреть в увеличение вакансий из Linkedln + остальные источники.

Соверешнно бесплатно и уже доступно для каждого: @ios_roadmap_academy_2024_bot
🔥3👍2🤯1
Получай новые вакансии прямо в боте

Сейчас все настройки у каждого пользователя по-умолчанию выключены. Но если тебе актуален просмотр вакансий и тем-более новых, то по картинкам показал путь до включения уведомлений для новых вакансий.

Тем самым тебе от бота будет приходить каждые 2 часа при наличии новых. Если вакансий открылось несколько - будет одно смс с разделением.

При нажатии на вакансию ты по диплинку перейдешь на детальный экран. Там уже на сам сайт, либо написать заметку или добавить в избранное и т.д.

Новые вакансии - это новые в БД мини App. Так как источников несколько.

• Бесплатно
• Доступно
• Легко и просто


@ios_roadmap_academy_2024_bot
🔥31👍1