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

Сейчас наполняю главу для изучения замыканий, думаю, что лучше этих двух видео и не найти даже:

1. https://www.youtube.com/watch?v=WeT1U9YiFAg
2. https://www.youtube.com/watch?v=410NFC0DYiM

Если - вдруг у кого проблемы с пониманием замыканий, то эти видео дадут прочный фундамент для понимания и работы, осталось лишь практика.

А вот capture list, delayed deallocation, autoclosure, проблема @escaping замыканий со SwiftUI, работа с ARC и вложенные замыкания + ARC — это уже на грейды повыше. Всё это можно найти и в ноушене, например вот здесь:

1. Capture list
2. Delayed deallocation
3. Autoclosures
4. Почему не стоит использовать escaping замыкание в SwiftUI
5. Escaping
6. Вложенные замыкания и ARC
🔥7🫡4👍3
#работа #шабашка

Всем привет, наш добрый друг — эйчар Семён поделился таким интересным графиком: https://public.tableau.com/app/profile/alkadarskiy.selim/viz/2021_16595984868110/232020

Актуально и сейчас. Как работать? Откликаться на вакансию либо ДО массовой активности других соискателей либо ПОСЛЕ чтобы ваш отклик был выше.
🔥14👍21
#полезное #swiftui #observable

lazy var в @Observable – почему не работает? 🤔

Если ты попробуешь использовать lazy var в @Observable классе, то наткнёшься на ошибку:

@Observable class MyClass {
private(set) lazy var something = "" // 'lazy' cannot be used on a computed property
}


Но почему так?

Ключевая проблема@Observable автоматически создаёт "синтезированные" свойства для отслеживания изменений. lazy var же инициализируется при первом доступе, а это конфликтует с механизмом синтеза.

Если добавить к нему макрос @ObservationIgnored, то система наблюдения будет игнорировать синтез для этого свойства.


@Observable class MyClass {
@ObservationIgnored
private(set) lazy var something = "" // 💚 Все ок, теперь можно!
}
🔥10👍32
#полезное #поиск_работы #линкедин

1. Создать ЛинкедИн;
2. Оформить профиль (можно как у меня, можно как у других людей с оформленным профилем);
3. Еженедельно расходуйте весь максимум на добавление контактов (100-150 шт). Добавляйте инфлюенсеров и рекрутеров и людей с большим количеством контактов - это поможет в будущем при посте: "я в поиске работы"/"я уволился" и т.п.;
4. Попросите знакомых заапрувить навыки на Линке;
5. Комментируйте рандомные посты, поздравляйте с днём бетона всех у кого день бетона, желайте удачи, ставьте лайки, пишите посты и повторюсь "расширяйте сеть контактов" — это гаранты вашего высокого SSI рейтинга. Чем выше эта залупа, тем вы "круче";
Ссылка для проверки SSI метрики на LinkedIn
6. Лайфхак: смешной мем в посте добавляет охватов больше, чем полезный "высер" + люди будут хихикать и потом мб вам придут и дадут ваку за хороший смех;
7. Делать всё нужно регулярно↑;
8. После 1000+ контактов можно забить хуй, но не рекомендую))))
9. Плашечка опенТуВорк: честно, холивар на ровном месте. Хотите ставьте, хотите нет);
10. Если вы в поиске работы — укажите ваш тг везде: в шапке, в заголовке, в "о себе", в контактах;
11. Можно заебаться и настроить авто-аутрич, когда к вам в контакт добавляется, чтобы от вас прилетало сообщение: салам аллейкум, одна тут? *Я такое не делал, так что не подскажу*;
12. Как искать ваки: в постах рекрутеров, через булевые запросы в поисковой строке линка, по хештегам, писать в лс рекрутерам и "привет рОдная, есть чем поживиться для пажилого?"

=КрАтЕньКо=

P.S. Я договорился с Семёном и будет гайд для небазовых, где он подробном и четко все сделат, в основном канале сегодня - завтра отпишу.
🔥177
Indie-разработка жива: $35K за 30 дней

На Reddit всплыл классный пост от разработчика, который в одиночку сделал $35K за последний месяц с iOS-приложением. Без команды, без инвестиций — просто стабильная indie-работа и правильный подход к монетизации.

Из интересного:

- Приложение — “AI Chat”, но не просто обёртка для ChatGPT. Там и оффлайн-модели, и быстрые ответы, и проработанный UX.
- Очень грамотно сделана монетизация — подписка через IAP, пробный период, и чёткое УТП.
- Основной трафик — органика и App Store SEO.

Потратил 3 месяца на MVP.
Сейчас работает над улучшением ретеншна и платящих пользователей.
Делает всё сам: код, UI, маркетинг, support.

Читай полный пост: [ссылка на статью]
🔥10👍32
#vibecoding

Если вы так же как и я, не совсем в теме про vibe coding, то данное видео в полной мере объяснит новое течение.

А есть ли тут vibe coder'ы? Ставьте голубя, посмотрим сколько нас! 🕊

https://www.youtube.com/watch?v=JeNS1ZNHQs8
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7🕊6👍1
#server_side #backend

Как построить бизнес на серверном Swift и open source: подкаст с Тимом Кондоном

Если тебе интересен Swift не только на iOS, но и на сервере — советую к просмотру последний выпуск Going Indie Podcast, где Тим Кондон рассказывает, как он построил устойчивый бизнес вокруг Vapor, open source и консалтинга.

Темы выпуска:
- Как перейти на инди-рельсы и преодолеть страх нестабильности
- Что значит быть ядром сообщества Server-Side Swift
- Как совмещать работу над Vapor, организацию конференций и личную жизнь
- Почему нетворкинг, личный бренд и выступления — это не только для экстравертов
- Как построить команду, начать зарабатывать на консалтинге и не выгореть


Тим делится очень честно — и о фейлах, и о росте, и о страхах. Если ты задумываешься о собственных проектах, хочешь уйти в инди или просто понять, как можно строить карьеру вне классического “работа в офисе” — это must-watch

👨‍💻 Кто такой Тим Кондон:
- Автор и мейнтейнер Vapor
- Основатель Broken Hands — компании по серверному Swift-консалтингу
- Член Swift Server Workgroup
- Организатор конференции ServerSide.swift
- Активный участник сообщества и автор курсов на Kodeco

🎞 Смотреть выпуск
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥52👍1
#observable #swiftui #deepdive

How SwiftUI Tracks UI Changes With Observable (Behind the Scenes)

На канале у Карин вышло видео про работу withObservationTracking. Где она рассказала всю необходимую информацию по этой функции.
- Что это и для чего
- Понимание работы механизма
- Чуть-чуть глубже взгляд на работу
- Как с этим работать и выводы

Посмотреть можно здесь. Эту функцию и многое другое, интересное и связанное с макросом observable мы рассмотрели в этом воркшопе ещё год назад. А в этом воркшопе я уже делился после опыта на вроде и рассматривали практичную информацию по работе на проде.

Читай подробно про каждый воркшоп внутри. А для тех у кого нет небазовой подписке, хочу поделиться парочкой ссылок из одного воркшопа. Они прям для совсем хардкорщиков, там deep dive самого deep dive и всё это в кубе deep dive для изучения withObservationTracking

- Swift Observation from Scratch — Part 1 of 2
- Swift Observation from Scratch — Part 2 of 2

Приятного просмотра и изучения! 👋
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍1
A Day in the Life of a SwiftUI View

Chris Eidhof раскрывает mental model SwiftUI, показыя, как наш код превращается в ephemeral view tree и в персистентный render treeAttributeGraph. Chris подробно объясняет, как @State интегрируется в граф, оптимизирует layout и что происходит при каждом вызове body.

https://www.youtube.com/watch?v=MRY3UCUVv98
https://www.youtube.com/watch?v=MRY3UCUVv98
https://www.youtube.com/watch?v=MRY3UCUVv98

> Текстовая версия доклада
> Похожая статейка в ноушен
> Подробно про AttributeGraph в ноушен
🔥51👍1
#weak_let #swift #concurrency

Раньше weak можно было только с var, и из-за этого классы и замыкания с такими ссылками не были Sendable, но с принятием этого проползола можно будет объявлять слабые ссылки с let, а не только с var.

Зачем это нужно?
- Убирает лишнюю мутируемость, weak let не мешает проверкам на безопасность в конкурентных контекстах.
- Закрывает брешь в sendability: классы и @Sendable-замыкания с weak let становятся полностью безопасными.

Про мотивацию
1. weak var считался мутируемым, потому что при деинициализации объекта ссылка сбрасывалась в nil.
2. На самом деле это не "мутация" значения, а просто особенность weak ref.
3. Теперь weak let отражает именно эту логику – неизменяемая слабая ссылка, которая по-прежнему может стать nil.

Прочитать подробнее и посмотреть можно здесь: https://github.com/swiftlang/swift-evolution/blob/main/proposals/0481-weak-let.md
🔥9👍4🤯1
final class Person {
var name: String

init(name: String) {
self.name = name
}
}

final class ViewModel: ObservableObject {
@Published var person = Person(name: "John")

func changeName() {
person.name = "Alice"
}
}

struct StateObjectInnerView: View {
@StateObject private var viewModel = ViewModel()

var body: some View {
Button {
viewModel.changeName()
} label: {
Text(viewModel.person.name)
}

Text("StateObject Demo").padding()
}
}


Ниже будет опрос 🎆
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет после нажатия на кнопку? Одного нажатия
Anonymous Poll
34%
John
66%
Alice
Вот здесь ответ, под спойлерами.

А прочитать подробнее: можно тут

P.S. Если хотите больше таких небольших задачек на основы работы чего-либо ставьте гхолубя.

А то получается, на собеседованиях спрашивают:
- Кишки
- Алгоритмы
- Рендер лупы

А тут простецкий вопрос вызывает затруднение...И ведь это рабочий use case. Работа с паблишерами, до макроса Observable, выполняется всегда! 👋
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🕊22🔥3👍2
final class ContentViewModel: ObservableObject {
@Published var text = "Hello @StateObject"

init() {
print("ViewModel init")
}

deinit {
print("ViewModel deinit")
}
}

struct ContentView: View {
@StateObject private var viewModel: ContentViewModel

init(viewModel: ContentViewModel) {
_viewModel = StateObject(wrappedValue: viewModel)

print("ContentView init")
}

var body: some View {
Text(viewModel.text)
}
}

struct RootView: View {
@State private var isOn = false

var body: some View {
VStack(spacing: 20) {
ContentView(viewModel: ContentViewModel())

if isOn { Text("is on") }

Button("Trigger") { isOn.toggle() }
}
}
}


Есть ли у этого кода проблема связанная с объявлением StateObject? Опрос ниже
Ответ скрыл под спойлер, а так же прилагаю ссылку в ноушене для детального изучения
🔥5👍4🕊3
Выполнение асинхронных задач в SwiftUI

Начиная с iOS 14 вместо Task {…} в onAppear начинаем юзать встроенный модификатор .task – он сам создаёт и отменяет задачу вместе с жизненным циклом View:


Text("Привет, мир!")
.task { // запускается при появлении и отменяется при уходе
await loadData()
}


Но зачем так делать?
- Не надо городить Task вручную и переживать об отмене.
- Внутри .task {} у тебя сразу async-контекст – можно вызывать await напрямик.
- Логика асинхронки отделена от onAppear и проще читается.

Но это ещё не всё. Если нужна реакция на изменения, например ты стал что-то вводить, то ты можешь вызывать конструктор с id:


.searchable(text: $query)
.task(id: query) { // каждый раз новый `query` – новая задача
results = await fetch(query)
}


Теперь при изменении query предыдущая задача отменяется автоматически. Но и это ещё не все!

Ты можешь управлять приоритетом. По умолчанию приоритет – .userInitiated, но можно указать свой и для этого можно взять соответствующий конструктор:


.task(priority: .background) {
await cleanupCache()
}


Используй модификатор .task, чтобы SwiftUI сам заботился о запуске и отмене твоих async-задач!
🔥14👍4😎31
func saveData() {
Task {
updateData()

print("Дата сохранена!")
}

func updateData() {
Task.detached {
self.isSaved = true
}
}
}


Есть переменная isSaved типа Boolean. Будет ли фиолетовая ошибка — если запустить данный код? Мыслим в парадигме работы на SwiftUI и только / Без UIKit

P.S. сама сущность где отработает saveData() без аннотации @MainActor

👍 - ДА

👎 - НЕТ

🕊 - ДА / НЕТ

-----

Через 10 минут ответ в скрытом тексте, удачи 🙂

UPD:

- Да здесь будет фиолетовая ошибка, потому-что нигде нет MainActor / DispatchQueue.main и тот кто ответил лайком ПРАВ, т.е смайл 👍

- Если использовать макрос observable, там это не нужно и поэтому НЕТ, в контексте и ДА и НЕТ тоже верно, т.е смайл 🕊.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14👎2🕊2