
- Главная
- Каталог
- Интернет технологии
- iOS Broadcast
Статистика канала
Если вы когда-то создавали приложение для терминала с UI, вы знаете, что это не просто. TUIkit — декларативный фреймворк для терминальных интерфейсов на Swift, так еще и с привычным SwiftUI DSL.
VStack, HStack, Text, Button, ForEachncurses и C‑зависимостей — только чистый Swift⭐️ GitHub: https://github.com/phranck/TUIkit
Если вы задавались целью реализовать веб авторизацию или оценить задачу, то сталкивались с вопросом а как это правильно сделать.
ASWebAuthenticationSession ждёт правильный URL‑callback, чтобы понять, что авторизация закончилась, и вернуть пользователя в приложение. Каждый раз приходится вспоминать, оставлю корректный гайд тут. Есть два способа:1. Custom URL scheme
myapp:// в Info.plist (CFBundleURLTypes).myapp://callback.ASWebAuthenticationSession стартуешь с callbackURLScheme = "myapp", и когда страница редиректит на myapp://..., сессия ловит URL и отдаёт его в completion:let session = ASWebAuthenticationSession(
url: authURL,
callbackURLScheme: "myapp"
) { callbackURL, error in
// разбираем токен из callbackURL
}
2. Universal links (HTTPS)
myapp://callback — обычный https://myapp.com/auth/callbackapple-app-site-association на сервереASWebAuthenticationSession логика та же: он ждёт редирект на твой callback‑URL и пробрасывает его в completion.func handleCallback(url: URL) {
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let token = components.queryItems?.first(where: { $0.name == "token" })?.value else {
return
}
}
Если интересны: гайды, рабочие фишки, примеры кода, новости, вакансии, мемы.
Swift оброс синтаксическим сахаром, и часть классных фич теряется в шуме. По мелким фишкам даже пишутся целые статьи, но гораздо полезнее перечитывать официальный гайд по языку. Собрал для вас несколько фишек, какие сам часто использую:
1. Паттерн‑матчинг в switch
let value: Int? = Int.random(in: 0...10)
switch value {
case let .some(v) where v > 5:
print("Большое число: \(v)")
case let .some(v):
print("Маленькое число: \(v)")
case .none:
print("nil")
}
let .some(v) — это как if let, но прямо внутри switch, плюс можно сразу вешать дополнительные условия через where2. Нюансы работы со строками
Со строками в Swift раньше было больно работать, но у стандартной библиотеки есть несколько новых фишек:
str[i]let s = "Привет"
let firstIndex = s.startIndex
let secondIndex = s.index(after: firstIndex)
let secondChar = s[secondIndex] // "р"
let prefix = s.prefix(3) // "При"
let suffix = s.suffix(2) // "ет"
func truncated(_ string: String, limit: Int) -> String {
guard string.count > limit else { return string }
let endIndex = string.index(string.startIndex, offsetBy: limit)
return String(string[string.startIndex..<endIndex]) + "…"
}
truncated("Привет, мир!", limit: 6) // "Привет…"
NSRange/NSString давно можно обойтись чистым Swift:let text = "https://example.com - мой сайт"
if let range = text.range(of: "https://") {
let prefix = text[..<range.lowerBound] // перед URL
let urlPart = text[range.lowerBound...] // начиная с URL
print(prefix) // ""
print(urlPart) // "https://example.com - мой сайт"
}
let sentence = "Hello, Swift world!"
let words = sentence
.split { $0.isWhitespace || $0.isPunctuation }
.map(String.init)
print(words) // ["Hello", "Swift", "world"]
3. Массивы
let zeros = Array(repeating: 0, count: 10)
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
let placeholders = Array(repeating: "—", count: 5)
// ["—", "—", "—", "—", "—"]
reduce(into:). Если обычный reduce возвращает новый массив/значение, то reduce(into:) позволяет изменять уже существующую структуру без лишних копийlet names = ["Alice", "Bob", "Eve", "Alex", "Ben"]
let grouped = names.reduce(into: [Character: [String]]()) { result, name in
guard let first = name.first else { return }
result[first, default: []].append(name)
}
// ["A": ["Alice", "Alex"], "B": ["Bob", "Ben"], "E": ["Eve"]]
По сути — мини‑
groupBy на стандартной библиотеке.zip — проход по двум массивам параллельноlet titles = ["Intro", "Chapter 1", "Chapter 2"]
let pages = [1, 5, 17]
for (title, page) in zip(titles, pages) {
print("\(title) начинается на странице \(page)")
}
prefix/suffix работают и тут:let numbers = [1, 2, 3, 4, 5, 6]
let firstThree = numbers.prefix(3) // [1, 2, 3]
let lastTwo = numbers.suffix(2) // [5, 6]
// Срез → обратно в Array при необходимости:
let firstThreeArray = Array(firstThree)
Ставь 👍 если нашел для себя что-то новое и 🤔 если знал все из этого списка
Ссылки в этот раз не будет, чисто мое мнение. Вообще, я давний фанат TDD подхода, классический TDD - это сначала тест, потом код. Это сильно забустило в свое время меня и как инженера (написание тестов перед кодов позволяют задумываться о архитектуре до написания кода) и как продакта (продумываение требований и граничных условий для написания тестов позволяет продумать многие аспекты, которые всплывали у многих только ближе к тестированию). В мире, где код всё чаще пишет AI, формула меняется, но суть та же: тесты задают правила игры.
Тесты как протокол общения с AI
Обычно взаимодействие с моделью выглядит так:
Создай модуль для работы со списком...
✨ магия ✨
Получаем код, который «вроде работает».
Но не знает, где у вас деньги, регуляторика, странные бизнес‑правила и больные edge‑кейсы.
Работа с AI-TDD
1. Сначала пишем тест-кейсы, можно использовать на этом этапе AI, он уже не плохо справляется с этой задачей, особенно при наличии ТЗ а не только пользовательского сценария
2. Просим агента написать тесты исходя из тест-кейсов, тут важно проверять самостоятельно соответствие тест-кейсам и предупредить модель что вы работаете по TDD и тесты должны опираться на модели и будут красными
2. Даём промпт в духе:
«Вот набор XCTest‑кейсов. Напиши/обнови реализацию так, чтобы все они проходили. Код можно менять как угодно, но сигнатуры публичных методов оставь.»
Роль тестов здесь меняется:
это уже не «страховка на потом», а контракт, который мы предъявляем модели.
В классическом цикле TDD:
red → green → refactor
С AI он становится больше похож на:
test → prompt → code → run tests → new prompt / refactor
Мини‑флоу на примерной задаче:
1. Формулируем поведение через тесты
Например, парсер промокодa, калькулятор скидки, валидатор формата.
2. Отправляем в AI:
3. Генерим реализацию и гоняем тесты.
4. Итеративно уточняем промпт, пока не станет зелёным:
Фокус смещается:
важно не то, кто написал конкретную строку кода, а насколько хорошо мы задали контракт и тестами, и промптом.
Что мне еще нравится в таком подходе с тестами, так это обесопашивание своего кода от вмешательства. В больших проектах нет твоего кода, есть блоки которые ты можешь ревьювить и если твой блок достаточно большой, то достаточно отслеживать изменение в тестах и если при изменении кода тесты не менялись и прошли, значит, как минимум, ничего сломаться не должно.
Неделю новинок от Apple захотелось закончить небольшой ретроспективой. Историей о моем первом Macbook и тех фишках и внимании к деталям, которое мы потеряли вместе с эрой скевоморфизма.
Это уже эпоха Unibody корпуса, но еще не Retina дисплей, корпус толстый и легко поддается апгрейду. Личное ощущение: тогдашние макбуки были объектом, а не просто ноутбуком
Фишка #1: «Дыхание» — pulsating sleep indicator
Белый светодиод, который "дышал" во сне, реализация поражала, металл в нужном месте истончили и перфорировали микроскопическими отверстиями. Паттерн моргания соответствовал человеческому дыханию во сне. Создавалось ощущение, что у ноутбука есть пульс и он действительно живет
Фишка #2: Светящееся яблоко
Подсветка логотипа осуществлялась за счёт подсветки матрицы, не отдельным светодиодом. По сути — чистый бренд и эстетика, но она породила целую культуру (стикеры, «чехлы с вырезом», вплоть до шуток в сериалах). Для разработчиков это был социальный маркер профессии. А при работе в тёмной комнате светящийся логотип был частью «атмосферы» при работе.
Фишка #3: Инфракрасный порт
Это был последний ноутбук который работал с пультом Apple Remote, я его даже покупал для управлениями Keynote. Тогда MacBook часто выступал и как медиаплеер в гостиной и IR‑порт был логичным. С появлением AirPlay и iOS‑пультов IR умер как класс
Фишка #4: Встроенный оптический привод (SuperDrive)
DVD‑фильмы, установка софта с дисков, запись дисков (CD/DVD) под проекты, музыку, бэкапы (до массового облака). Это был важный момент: "всё с собой" — ноут был автономным центром работы и медиа без внешних свистоперделок.
Фишка #5: Кнопка и индикатор уровня заряда на корпусе
Маленькая кнопка + линейка LED‑точек сбоку. Использовалась только чтобы посмотреть заряд без включения ноутбука, не открывая крышку. Это использовалось для быстрой проверки перед выходом, хватит ли на встречу. Сейчас это кажется мелочью, но UX был очень приятным и физически понятным.
По технических характеристикам этот ноутбук ничем не выделялся:
В 2013 году уже были Retina ноутбуки, но этот был самый дешевый и именно по-этому я его и купил. А теперь
самый дешевый -
MacBook Neo. Есть ли в нем "душа", решать тем кто его купит. Мне немного жаль что внимание к таким мелочам и их осознанный дизайн остались лишь частью истории Apple. Какой ноутбук запомнился вам?P.S. Первое фото из личного архива
Apple показала новый MacBook Neo — «входной билет» в мир Mac с чипом A18 Pro и ценой от 599$ (499$ для образования). Упор — на дизайн, автономность и «достаточную» мощность для повседневных задач и AI‑фич.
Ключевые факты:
По сути, MacBook Neo — это «народный» MacBook для студентов, школ и тех, кому нужен первый Mac для базовой работы, учёбы и лёгкого креатива, но с акцентом на современный дизайн, автономность и встроенный AI. Очень много железа по цене iPhone
Продажи стартуют 11 марта.
Наткнулся на топовый инструмент для отладки и раскатки на beta пользователей. DebugSwift — это комплексный тулкит, который упрощает диагностику и анализ состояния приложения. Интеграция максимально простая, в AppDelegate
debugSwift.setup() и в любом месте, например по тряске вызвать debugSwift.toggle()🌐 Network Inspector
⚡️ Performance
📱 App Tools
🎨 Interface Tools
📁 Resources
Ну и на "сладенькое" Apple приберегла обновление Macbook, бюджетник пока не представили, но вот Air стал бюджетнее несмотря на подорожание комплектующих.
💻 Macbook Air
💻 Macbook Pro
Новые "особенности":
Ценовая линейка:
Старт продаж 11 марта, добавлю больше фото в тред, уже решили на что обновляться?
И ещё одно обновление от Apple сегодня-рабочая лошадка на m4, тот же форм‑фактор, но внутри уже M4, больше памяти и новые модемы
В угоду сохранения цены оставили версию на 128GB. Если взять 13" на 128GB с LTE, добавить клавиатуру и стилус, без образовательной программы получим уже 1377$, MacBook Air с клавиатурой и 256GB стоит 999$, выбор очевиден?
Отзывы канала
Каталог Телеграм-каналов для нативных размещений
iOS Broadcast — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 3.5K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 7.2, количество отзывов – 0, со средней оценкой 0.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 19720.26 ₽, а за 0 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий