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

Swift добавляет Vector, новый тип в стандартной библиотеке, который представляет собой массив фиксированного размера. Это альтернатива классическим C-массивам: T[N], std::array<T, N> в C++ и [T; N] в Rust.

Почему это важно?

Обычные массивы — это динамические структуры данных, которые выделяются на heap и могут быть излишне затратными для небольших массивов фиксированного размера. Vector, напротив, хранит элементы на stack или inline, что обеспечивает высокую производительность и минимизацию накладных расходов.

Основные преимущества Vector:

- Фиксированный размер: размер массива задаётся при создании.

- Высокая производительность: нет динамического выделения памяти.

- Безопасность: инлайн-инициализация элементов с возможностью индексации и итерации.

Пример использования:
let numbers: Vector<4, Int> = [1, 2, 3, 4]

for i in numbers.indices {
print(numbers[i])
}


Vector будет полезен, когда нужен массив фиксированного размера без накладных расходов динамической памяти. Будущий кандидат для собеседований? - Абсолютно. Будет ли применяться на практике? - Поживём, увидем.

Официальный обзор и примеры можно найти в предложении SE-0453.
🔥15👍3
Pets vs. Cattle — Почему 99% твоего кода отправят в утиль (и это нормально)

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

Что если, значительная часть работы делается в стол? Значит ли это, что происходит бесполезная работа?

💡 "Pets vs. Cattle" — концепция из DevOps, которая применима и к разработке.

Pets — уникальные, любимые проекты, которым уделяют особое внимание. Они требуют постоянного ухода, улучшений и переживаний.

Cattle — код, который выполняет свою задачу, а потом его заменяют новым, без лишних сантиментов.

🔹 Большинство разработчиков относятся к своему коду как к питомцу: холят, лелеют, бесконечно рефакторят.
🔹 А бизнесу нужны "коровы", которые дают результат здесь и сейчас.

Что если мы можем принять тот факт, что 99% кода не переживет следующий бизнес-цикл. И это нормально. Настоящий профессионал не хранит код, а учится эффективно управлять "фермой". Чтобы разобраться в этом вопросе, можно почитать статью у Вастрика, а своим мнением поделиться в чате.
🔥8👍2
Swift 6.1 и новинки в многопоточности

Swift 6.1 (beta) привносит важные изменения для работы с асинхронностью и акторами. Если ты следишь за эволюцией concurrency в Swift, вот что стоит знать:

[Изолированный deinit (будет в будущем)]

Разработчики давно ждали, чтобы deinit мог быть привязан к актору. В будущем можно будет явно указывать isolated deinit, например, для @MainActor классов. Это упростит управление памятью, но принесёт небольшие накладные расходы.
---

[Расширенное использование nonisolated]

Теперь nonisolated можно указывать сразу на всём расширении, а не на каждом методе. Это избавляет от дублирования, особенно при реализации протоколов в @MainActor классах.

💡 Было:

extension MainActorType: NotIsolated {
nonisolated func doStuff() {}
nonisolated func doThings() {}
}


💡 Стало:

nonisolated extension MainActorType: NotIsolated {
func doStuff() {}
func doThings() {}
}

Меньше кода — больше удобства.

---

[Автоматический вывод типа в TaskGroup]

Раньше в withTaskGroup приходилось вручную указывать тип результатов. Теперь компилятор умеет автоматически определять тип из контекста.

💡 Было:

let messages = await withTaskGroup(of: Message.self) { group in
// ...
}


💡 Стало:

let messages = await withTaskGroup { group in
// Swift сам понимает, что тут Message!
}


Типы всё ещё нужно указывать в сложных случаях, но в большинстве ситуаций — компилятор справляется сам.

Подробный разбор всех нововведений — читай тут.
8👍4🔥3
#обучение

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

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