Семантика версионирования для Swift Package и не только
Представьте, что мы используем библиотеку из популярного пакета Swift. Что случится, если выпустят новую версию с огромными изменениями в ее публичном API? Наш код может сломаться. Чтобы избежать этой проблемы, мы могли бы полагаться на единственную версию. Хуже, если каждый владелец пакета имеет свой способ работы с версиями. Такие сценарии называются адом зависимостей (dependency hell).
Семантическое версионирование - это спецификация, призванная положить конец аду зависимостей. Она разделяет версии на три числа: major, minor и patch (например, 1.5.8). Вот что означает каждый номер:
🔵 Major — публичный API изменился, что требует обновления нашего кода.
🔵 Minor — в общедоступный API был добавлен новый код, который не нарушает существующие интеграции (обратная совместимость).
🔵 Patch — были исправлены ошибки без изменения публичного API.
📖 Здесь понятно объясняется, почему нужно делать именно так на примерах.
@iOS Dev
Представьте, что мы используем библиотеку из популярного пакета Swift. Что случится, если выпустят новую версию с огромными изменениями в ее публичном API? Наш код может сломаться. Чтобы избежать этой проблемы, мы могли бы полагаться на единственную версию. Хуже, если каждый владелец пакета имеет свой способ работы с версиями. Такие сценарии называются адом зависимостей (dependency hell).
Семантическое версионирование - это спецификация, призванная положить конец аду зависимостей. Она разделяет версии на три числа: major, minor и patch (например, 1.5.8). Вот что означает каждый номер:
🔵 Major — публичный API изменился, что требует обновления нашего кода.
🔵 Minor — в общедоступный API был добавлен новый код, который не нарушает существующие интеграции (обратная совместимость).
🔵 Patch — были исправлены ошибки без изменения публичного API.
📖 Здесь понятно объясняется, почему нужно делать именно так на примерах.
@iOS Dev
Как отменить асинхронную задачу в Swift?
💡Один из возможных способов — использование DispatchWorkItem.
@iOS Dev
💡Один из возможных способов — использование DispatchWorkItem.
DispatchWorkItem
инкапсулирует работу, которая должна быть выполнена в очереди диспетчеризации или в группе диспетчеризации. Его также можно использовать в качестве обработчика события, регистрации или отмены DispatchSource.@iOS Dev
‼️ Сегодня 30 июня, а значит, что пора наконец уже реализовать в ваших приложениях удаление профиля, если вы этого ещё не сделали.
В целом, ситуация не выглядит сложной, если вы используете решения, в которых нет Sign In от Apple или же у вас собственный сервер для этого 😅.
Например, в одном из моих приложений используется как раз связка Sign In + Firebase, и, как оказывается, разработчики ещё не реализовали отзыв токена. К слову, iOS тоже такого инструмента не предоставляет, нужно генерить JWT и отзывать его только с помощью сервера.
Вероятно, в будущем или Google, или Apple уже упростят нам жизнь. А пока что можно воспользоваться решением из треда Firebase, или же от Ивана:
👏 Вот пост, который может пригодиться (как минимум, натолкнёт на правильный ход мыслей).
Всё равно, конечно, механизм не совсем тривиальный, нужно запросить код авторизации + сгенерить ключ в вашем аккаунте, но в целом ситуация уже будет выглядеть рабочей.
В целом, возможно несколько путей развития событий, среди которых кажется вероятным продление этого срока, не такая тщательная проверка отзыва токена на ревью, или апгрейд SDK через какое-то время.
❤️ Слежу за развитием событий, ваш @iOS Dev
В целом, ситуация не выглядит сложной, если вы используете решения, в которых нет Sign In от Apple или же у вас собственный сервер для этого 😅.
Например, в одном из моих приложений используется как раз связка Sign In + Firebase, и, как оказывается, разработчики ещё не реализовали отзыв токена. К слову, iOS тоже такого инструмента не предоставляет, нужно генерить JWT и отзывать его только с помощью сервера.
Вероятно, в будущем или Google, или Apple уже упростят нам жизнь. А пока что можно воспользоваться решением из треда Firebase, или же от Ивана:
👏 Вот пост, который может пригодиться (как минимум, натолкнёт на правильный ход мыслей).
Всё равно, конечно, механизм не совсем тривиальный, нужно запросить код авторизации + сгенерить ключ в вашем аккаунте, но в целом ситуация уже будет выглядеть рабочей.
В целом, возможно несколько путей развития событий, среди которых кажется вероятным продление этого срока, не такая тщательная проверка отзыва токена на ревью, или апгрейд SDK через какое-то время.
❤️ Слежу за развитием событий, ваш @iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
RoomPlan в iOS 16 — 3D-планы этажей в ваших приложениях
Это новый API Swift, работающий на базе ARKit, использует камеру и сканер LiDAR на iPhone и iPad. Теперь ваши приложения могут создавать трехмерные планы этажей, включая ключевые характеристики, такие как размеры и типы мебели.
Фреймворк использует датчики устройства, ML-модели и RealityKit для захвата физического окружения. Например, фреймворк просматривает записи с камеры устройства и показания LiDAR и определяет стены, окна, проемы и двери.
Для захвата используется
⚪ Графические наложения в реальном времени отображаются поверх объектов в комнате, чтобы передать ход сканирования.
⚪ Если фреймворк требует определенного вида движения или ракурса, UI покажет инструкции, как расположить устройство.
🛠 Пример кода (нужен Xcode 14).
@iOS Dev
Это новый API Swift, работающий на базе ARKit, использует камеру и сканер LiDAR на iPhone и iPad. Теперь ваши приложения могут создавать трехмерные планы этажей, включая ключевые характеристики, такие как размеры и типы мебели.
Фреймворк использует датчики устройства, ML-модели и RealityKit для захвата физического окружения. Например, фреймворк просматривает записи с камеры устройства и показания LiDAR и определяет стены, окна, проемы и двери.
RoomPlan
распознает особенности помещения, мебель и технику, например, камин, кровать или холодильник, и передаёт данные в приложение.Для захвата используется
RoomCaptureView
. Есть виртуальные подсказки по мере перемещения по комнате:⚪ Графические наложения в реальном времени отображаются поверх объектов в комнате, чтобы передать ход сканирования.
⚪ Если фреймворк требует определенного вида движения или ракурса, UI покажет инструкции, как расположить устройство.
🛠 Пример кода (нужен Xcode 14).
@iOS Dev
Написал туториал по отображению лицензий из CocoaPods в приложениях
Главная фишка — для этого почти не надо писать код, в pod-файле не считается же? 😅.
Прочесть можно прямо здесь, в телеграме.
😎 Или же на хабре.
@iOS Dev
Главная фишка — для этого почти не надо писать код, в pod-файле не считается же? 😅.
Прочесть можно прямо здесь, в телеграме.
😎 Или же на хабре.
@iOS Dev
Telegraph
Как добавить список лицензий и благодарностей CocoaPods и при чём тут Settings.Bundle?
Для этого даже не понадобится писать код (ну почти). CocoaPods по мнению многих доживает свои славные времена, ведь развитие и распространение SPM (Swift Package Manager) продолжает набирать обороты. Но для тех, кто из вас до сих пор использует CocoaPods…
Полное руководство по использованию таймеров в Swift ⏳
О создании, повторениях и не только.
Класс Timer в Swift - это гибкий способ планирования будущих задач, как однократно, так и многократно.
📖 В этом руководстве представлены несколько способов работы с ним, а также решение частых проблем.
Примечание. Прежде чем начать, автор напоминает, что использование таймеров требует значительных затрат энергии. Будут рассмотрены способы смягчения этой проблемы.
🧐 Несмотря на это, в целом любой вид таймера должен вывести систему из состояния покоя, чтобы запустить работу, а это влечет за собой соответствующие затраты.
@iOS Dev
О создании, повторениях и не только.
Класс Timer в Swift - это гибкий способ планирования будущих задач, как однократно, так и многократно.
📖 В этом руководстве представлены несколько способов работы с ним, а также решение частых проблем.
Примечание. Прежде чем начать, автор напоминает, что использование таймеров требует значительных затрат энергии. Будут рассмотрены способы смягчения этой проблемы.
🧐 Несмотря на это, в целом любой вид таймера должен вывести систему из состояния покоя, чтобы запустить работу, а это влечет за собой соответствующие затраты.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
2 000 iOS-разработчиков в канале
Невероятно, amazing, как это вообще возможно?!
🛠 Поделюсь своим рецептом: 400 постов, 15 публикаций на хабре, 12 статей в телеграфе, одна проведённая трансляция #WWDC и время, потраченное на разборы новинок и не только.
Но всё это не имеет значения, если бы вы не читали этот канал. Поэтому — спасибо, коллеги! ❤️
Наш путь продолжается, туториалы, хаки, фишки Xcode и не только — в канале @iOS Dev
👍❤️🔥👏🎉 - вы знаете, что с этим делать😅
Чуть не забыл, помните небольшую традицию в этом канале? Гифка, как обычно, использует какой-то не совсем обычный компонент, на этот раз вы можете посмотреть реализацию здесь.
Невероятно, amazing, как это вообще возможно?!
🛠 Поделюсь своим рецептом: 400 постов, 15 публикаций на хабре, 12 статей в телеграфе, одна проведённая трансляция #WWDC и время, потраченное на разборы новинок и не только.
Но всё это не имеет значения, если бы вы не читали этот канал. Поэтому — спасибо, коллеги! ❤️
Наш путь продолжается, туториалы, хаки, фишки Xcode и не только — в канале @iOS Dev
👍❤️🔥👏🎉 - вы знаете, что с этим делать😅
Чуть не забыл, помните небольшую традицию в этом канале? Гифка, как обычно, использует какой-то не совсем обычный компонент, на этот раз вы можете посмотреть реализацию здесь.
This media is not supported in your browser
VIEW IN TELEGRAM
Построение 3D-диаграмм с помощью SceneKit и SwiftUI
В прошлом месяце Apple анонсировала диаграммы на #WWDC, о них уже было написано несколько туториалов и даже есть целый репозиторий с примерами практически всех видов графиков.
Автор же этого материала пошёл дальше, и уделил своё внимание построению 3D круговых диаграмм с помощью SceneKit.
Это еще и хороший повод взглянуть на несколько других аспектов фреймворка.
📖 Даже абстрагируясь от SwiftUI, в статье можно прочесть про использование математики для построения путей и расширить свои знания о применении
@iOS Dev
В прошлом месяце Apple анонсировала диаграммы на #WWDC, о них уже было написано несколько туториалов и даже есть целый репозиторий с примерами практически всех видов графиков.
Автор же этого материала пошёл дальше, и уделил своё внимание построению 3D круговых диаграмм с помощью SceneKit.
Это еще и хороший повод взглянуть на несколько других аспектов фреймворка.
📖 Даже абстрагируясь от SwiftUI, в статье можно прочесть про использование математики для построения путей и расширить свои знания о применении
UIBezierPath
.@iOS Dev
8 советов для программистов от Пола Хадсона
Пол Хадсон — создатель книги «Hacking with Swift». Он также является редактором Swift Developer News, сопровождающим Swift Knowledge Base и выступает на Swift-мероприятиях по всему миру.
1️⃣ Технологии будут меняться, поэтому не зацикливайтесь на одном языке или фреймворке.
2️⃣ Вы не сможете запомнить все, что узнаете, или даже 10% от этого.
3️⃣ Вам не нужна степень в области компьютерных наук, но фундаментальные знания необходимы.
4️⃣ Вы всегда будете учиться, и если вы примете это, то станете счастливее.
5️⃣ Вы должны учиться эффективно.
6️⃣ Немного математики не помешает.
7️⃣ Вам нужна стойкость, чтобы бороться с проблемами, с которыми вы столкнетесь.
8️⃣ Наша работа — это не только код.
@iOS Dev
Пол Хадсон — создатель книги «Hacking with Swift». Он также является редактором Swift Developer News, сопровождающим Swift Knowledge Base и выступает на Swift-мероприятиях по всему миру.
1️⃣ Технологии будут меняться, поэтому не зацикливайтесь на одном языке или фреймворке.
2️⃣ Вы не сможете запомнить все, что узнаете, или даже 10% от этого.
3️⃣ Вам не нужна степень в области компьютерных наук, но фундаментальные знания необходимы.
4️⃣ Вы всегда будете учиться, и если вы примете это, то станете счастливее.
5️⃣ Вы должны учиться эффективно.
6️⃣ Немного математики не помешает.
7️⃣ Вам нужна стойкость, чтобы бороться с проблемами, с которыми вы столкнетесь.
8️⃣ Наша работа — это не только код.
@iOS Dev
В Swift 5.7 (и iOS 16) появились новые API для взаимодействия со временем, состоящие из трех основных компонентов: clock, instant и duration.
⏳ Мы можем использовать эти новые API для задержки асинхронной задачи более выразительным способом, нежели с с помощью старого API, который принимал наносекунды.
В примере на скриншоте мы используем свойство .now для получения текущего момента времени и добавляем duration для откладывания задачи на 10 секунд. Также можно указать tolerance, что позволит основным механизмам планирования слегка скорректировать время, если это необходимо для более энергоэффективного выполнения. Мы можем указать свойство часов одним из двух вариантов continuous или suspending.
ℹ️ Разница между continuous и suspending в том, что в первом случае часы непрерывны, а во втором приостановлены, пока система спит.
@iOS Dev
⏳ Мы можем использовать эти новые API для задержки асинхронной задачи более выразительным способом, нежели с с помощью старого API, который принимал наносекунды.
В примере на скриншоте мы используем свойство .now для получения текущего момента времени и добавляем duration для откладывания задачи на 10 секунд. Также можно указать tolerance, что позволит основным механизмам планирования слегка скорректировать время, если это необходимо для более энергоэффективного выполнения. Мы можем указать свойство часов одним из двух вариантов continuous или suspending.
ℹ️ Разница между continuous и suspending в том, что в первом случае часы непрерывны, а во втором приостановлены, пока система спит.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Повторение функциональности вкладки поиска в App Store
📖 Идея реализации в этой статье заключается в том, чтобы разделить тип поиска на категории и менять местами контроллеры в зависимости от того, что сейчас ищется.
Можно дополнить свою базу знаний ещё одним примером использования
🛠 Код из примера здесь. Предлагаемые результаты поиска будут работать только для одного приложения, но для понимания концепции этого должно хватить😎.
@iOS Dev
📖 Идея реализации в этой статье заключается в том, чтобы разделить тип поиска на категории и менять местами контроллеры в зависимости от того, что сейчас ищется.
Можно дополнить свою базу знаний ещё одним примером использования
UISearchController
и UISearchResultUpdating
.🛠 Код из примера здесь. Предлагаемые результаты поиска будут работать только для одного приложения, но для понимания концепции этого должно хватить😎.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Интерактивные анимации как в Spotify
Анимация — неотъемлемая часть современных мобильных приложений. Они дают пользователям обратную связь об их действиях и уведомляют о том, что происходит в приложении. Кроме того, анимации придают приложению более качественный вид и ощущение.
📖 В этой статье автор рассказывает, как создать интерактивные анимации, похожие на те, что вы видели в приложении Spotify для iOS.
🛠 Пример тестового приложения на Github.
@iOS Dev
Анимация — неотъемлемая часть современных мобильных приложений. Они дают пользователям обратную связь об их действиях и уведомляют о том, что происходит в приложении. Кроме того, анимации придают приложению более качественный вид и ощущение.
📖 В этой статье автор рассказывает, как создать интерактивные анимации, похожие на те, что вы видели в приложении Spotify для iOS.
🛠 Пример тестового приложения на Github.
@iOS Dev
Помните серию реклам Mac против PC?
😅 Оказывается, что Apple продолжает шутить над Microsoft даже спустя столько лет.
Сегодня по случайному совпадению в стандартных SF Symbols наткнулся на забавную вещь. Факт заключается в том, что PC представлен именно так, как на скриншоте. Это не что иное, как стандартный синий экран, он же экран смерти на компах под управлением Windows 😉.
Если не верите, попробуйте вбить в поиск в SF Symbols запрос PC и получите именно такой результат!
@iOS Dev
😅 Оказывается, что Apple продолжает шутить над Microsoft даже спустя столько лет.
Сегодня по случайному совпадению в стандартных SF Symbols наткнулся на забавную вещь. Факт заключается в том, что PC представлен именно так, как на скриншоте. Это не что иное, как стандартный синий экран, он же экран смерти на компах под управлением Windows 😉.
Если не верите, попробуйте вбить в поиск в SF Symbols запрос PC и получите именно такой результат!
@iOS Dev
Дженерики в Swift на примерах: что это и как использовать
💡 Дженерики в Swift позволяют писать обобщенный и многократно используемый код, избегая дублирования.
Вы, вероятно, уже пользовались их реализацией, поскольку они повсюду в стандартной библиотеке Swift.
⭐️ Вот несколько причин добавить этот пост в избранное:
⚫ Объяснение, что такое generics в Swift.
⚫ Примеры создания.
⚫ Ответ на вопрос, когда их лучше использовать.
Совет. Ничего страшного, если вы только начинаете изучать Swift, ведь сразу писать эффективный код непросто. Дженерики делают ваш код более сложным для сопровождения, но при этом вы получите преимущество в виде меньшего количества дублирования.
Возможен компромисс, который будет легче принять, исходя из вашего опыта.
Написание такого кода не должно стать самоцелью, и если вам некомфортно его писать, лучше поначалу не внедрять такой подход абсолютно везде.
Тем не менее, дженерики позволяют вам создавать надёжный код и готовиться к случаям его переиспользования.
@iOS Dev
💡 Дженерики в Swift позволяют писать обобщенный и многократно используемый код, избегая дублирования.
Вы, вероятно, уже пользовались их реализацией, поскольку они повсюду в стандартной библиотеке Swift.
⭐️ Вот несколько причин добавить этот пост в избранное:
⚫ Объяснение, что такое generics в Swift.
⚫ Примеры создания.
⚫ Ответ на вопрос, когда их лучше использовать.
Совет. Ничего страшного, если вы только начинаете изучать Swift, ведь сразу писать эффективный код непросто. Дженерики делают ваш код более сложным для сопровождения, но при этом вы получите преимущество в виде меньшего количества дублирования.
Возможен компромисс, который будет легче принять, исходя из вашего опыта.
Написание такого кода не должно стать самоцелью, и если вам некомфортно его писать, лучше поначалу не внедрять такой подход абсолютно везде.
Тем не менее, дженерики позволяют вам создавать надёжный код и готовиться к случаям его переиспользования.
@iOS Dev
Три способа добавить блюр-эффект на ваши изображения: хороший, плохой, злой
На самом деле второй тоже хороший
Первый способ — UIBlurEffect
Возможно, это самый стандартный из всех.
Нужно помнить, что
Второй способ — CIFilter
Apple предоставляет целый набор инструментов под названием
Третий способ — Гауссово сглаживание с ядрами.
Есть замечательная статья от Apple про эту технику. Пример кода, представленный в статье, показывает не только то, как работает гауссово размытие в Swift, но и как реализовать его в вашем проекте.
Этот метод вызывает низкоуровневые техники, такие как свертка — например,
В чем преимущество злого способа (злой - метафора, конечно)? Если вкратце, использование свертки и высокоскоростных ядер экономит время.
Много времени.
😉Ах да, кстати, разобрался с оплатой премиума в Телеге и теперь посты даже с картинками будут насыщеннее (не всегда). А ещё вы сможете поставить новые эмодзи (если у вас есть премиум).
@iOS Dev
На самом деле второй тоже хороший
Первый способ — UIBlurEffect
Возможно, это самый стандартный из всех.
let view = UIView()
let blurEffect = UIBlurEffect(style: .light)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
view.addSubview(blurEffectView)
Нужно помнить, что
UIBlurEffect
не является фильтром, из названия следует, что это всё-таки эффект, и может быть применён по факту к любой картинке (и любому UIView
).Второй способ — CIFilter
Apple предоставляет целый набор инструментов под названием
CIFilter
. Среди них есть CGaussianBlur
, который отлично подходит для достижения задачи. Как часть UIKit, его также просто внедрить.func addBlurTo(_ image: UIImage) -> UIImage? {
if let ciImg = CIImage(image: image) {
ciImg.applyingFilter("CIGaussianBlur")
return UIImage(ciImage: ciImg)
}
return nil
}
Третий способ — Гауссово сглаживание с ядрами.
Есть замечательная статья от Apple про эту технику. Пример кода, представленный в статье, показывает не только то, как работает гауссово размытие в Swift, но и как реализовать его в вашем проекте.
Этот метод вызывает низкоуровневые техники, такие как свертка — например,
vImageConvolve_ARGB8888
.В чем преимущество злого способа (злой - метафора, конечно)? Если вкратце, использование свертки и высокоскоростных ядер экономит время.
Много времени.
😉Ах да, кстати, разобрался с оплатой премиума в Телеге и теперь посты даже с картинками будут насыщеннее (не всегда). А ещё вы сможете поставить новые эмодзи (если у вас есть премиум).
@iOS Dev
Загрузка файлов в фоновом режиме с помощью URLSessionDownloadTask
📖 В этой статье демонстрируется, как использовать
Фактически загрузка будет выполняться системой вне процесса приложения, поэтому он продолжится, когда приложение закрыто. Это будет справедливо и для загрузки файлов с помощью
В примере также показано, как реализовать мониторинг выполнения для нескольких параллельно выполняющихся задач.
Важные моменты
Если приложение будет приостановлено (процесс приложения будет завершен) во время загрузки, а затем снова запущено, если загрузка все еще активна, вы сможете обратиться к URLSession с тем же идентификатором, и снова будут поступать уведомления о ходе загрузки.
Но если задача завершена, а приложение не запущено, система запустит приложение в фоновом режиме и вызовет метод AppDelegate
Это единственный способ получить уведомление о такой загрузке:
💡 Это сложно дебажить, но можно подключиться через Debug > Attach to Process by PID or Name. Тогда ситуация с отладкой станет проще.
@iOS Dev
📖 В этой статье демонстрируется, как использовать
URLSessionDownloadTask
для загрузки файлов в фоновом режиме, чтобы они могли быть завершены, даже если приложение завершено.Фактически загрузка будет выполняться системой вне процесса приложения, поэтому он продолжится, когда приложение закрыто. Это будет справедливо и для загрузки файлов с помощью
URLSessionUploadTask
. В примере также показано, как реализовать мониторинг выполнения для нескольких параллельно выполняющихся задач.
Важные моменты
Если приложение будет приостановлено (процесс приложения будет завершен) во время загрузки, а затем снова запущено, если загрузка все еще активна, вы сможете обратиться к URLSession с тем же идентификатором, и снова будут поступать уведомления о ходе загрузки.
Но если задача завершена, а приложение не запущено, система запустит приложение в фоновом режиме и вызовет метод AppDelegate
handleEventsForBackgroundURLSession
. Это единственный способ получить уведомление о такой загрузке:
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
os_log("handleEventsForBackgroundURLSession for %@", type: .info, identifier)
completionHandler()
}
}
💡 Это сложно дебажить, но можно подключиться через Debug > Attach to Process by PID or Name. Тогда ситуация с отладкой станет проще.
@iOS Dev
Декомпозиция задачи или почему добавить одно поле это приключение НЕ на одну минуту?
Допустим, вы пишете приложение (как неожиданно) и вам поступила задача отобразить номер телефона в профиле пользователя. Менеджер спросит, сколько это займёт, ожидая услышать ответ сразу же. Но вы отвечаете, что нужно подумать, и ваш менеджер пассивно-агрессивно спрашивает, что тут думать — это одно же поле.
«Вошли и вышли, приключение на 20 минут, Морти!»
К сожалению, зачастую это не так. Особенно если данные для этого поля не хранятся локально.
Во-первых, требующий немедленного ответа менеджер — не самый приятный вариант. Профессионалы своего дела понимают, почему иногда даже на такой, казалось бы, очевидный вопрос может потребоваться время.
Во-вторых, причиной этого может быть непонимание этапов, которые требуется пройти разработчику/команде при реализации.
При постановке вопроса из примера мы должны перечислить следующие пункты:
— Реализовано ли это на сервере? Поверьте, зачастую бывают сложности коммуникации и загруженность у разных команд, парадоксально, разная. От ответа на этот вопрос оценка может взлететь по очевидной причине, ведь если фича не реализована, то пока что в прод выкатить её точно не получится.
— Насколько сложно будет изменить структуру в БД? Нужна ли миграция? Тут поможет опыт прошлых апдейтов.
— Нужна ли локализация этого поля? Заглушки, например. Здесь мы видим то, что как и с вопросом про реализацию на сервере не всё зависит от нас.
— Нужна ли валидация этого номера телефона? Нужны ли нам регулярки, может ли номер содержать буквы, например? Сколько может быть символов? Возможно, вы и не удивитесь, но буквы в номерах возможны как минимум в рекламе.
— Какой шрифт, какой цвет, как оформить вообще? Нужна ли анимация при переводе фокуса ввода?
От задачи к задаче подпункты могут быть разными, но постановка вопроса — половина решения.
В списке выше на самом деле можно выделить сразу два вида декомпозиции:
Вертикальная: сервер, перевод от команды переводчиков, реализация на клиенте.
И горизональная для приложения: подзадача про валидацию, про оформление, про хранение.
Разработчик с опытом может выдать ответ быстро, если он 1 000 раз проводил подобную декомпозицию. Но вот ответ от него может различаться от ответа джуниора, готового лезть на амбразуру сразу же.
Декомпозиция нужна, чтобы:
— Понять последовательность выполнения задач.
— Оценить сроки.
— Упростить процесс тестирования.
— Помочь расставить приоритеты. В спринте, но по-хорошему, изначально в бэклоге.
Два небольших вывода:
1️⃣ Мы работаем на бизнес. Поэтому мы должны понимать, почему менеджер может быть недоволен медленной оценкой.
2️⃣ Хочется верить, что этот пост прочтут не только разработчики, но и проект-менеджеры. Профессионалы улыбнутся и скажут, что так и есть. Но те, кто начинает управлять командами — пожалуйста, прочтите этот пост ещё раз.
Специально для @iOS Dev
Допустим, вы пишете приложение (как неожиданно) и вам поступила задача отобразить номер телефона в профиле пользователя. Менеджер спросит, сколько это займёт, ожидая услышать ответ сразу же. Но вы отвечаете, что нужно подумать, и ваш менеджер пассивно-агрессивно спрашивает, что тут думать — это одно же поле.
«Вошли и вышли, приключение на 20 минут, Морти!»
К сожалению, зачастую это не так. Особенно если данные для этого поля не хранятся локально.
Во-первых, требующий немедленного ответа менеджер — не самый приятный вариант. Профессионалы своего дела понимают, почему иногда даже на такой, казалось бы, очевидный вопрос может потребоваться время.
Во-вторых, причиной этого может быть непонимание этапов, которые требуется пройти разработчику/команде при реализации.
При постановке вопроса из примера мы должны перечислить следующие пункты:
— Реализовано ли это на сервере? Поверьте, зачастую бывают сложности коммуникации и загруженность у разных команд, парадоксально, разная. От ответа на этот вопрос оценка может взлететь по очевидной причине, ведь если фича не реализована, то пока что в прод выкатить её точно не получится.
— Насколько сложно будет изменить структуру в БД? Нужна ли миграция? Тут поможет опыт прошлых апдейтов.
— Нужна ли локализация этого поля? Заглушки, например. Здесь мы видим то, что как и с вопросом про реализацию на сервере не всё зависит от нас.
— Нужна ли валидация этого номера телефона? Нужны ли нам регулярки, может ли номер содержать буквы, например? Сколько может быть символов? Возможно, вы и не удивитесь, но буквы в номерах возможны как минимум в рекламе.
— Какой шрифт, какой цвет, как оформить вообще? Нужна ли анимация при переводе фокуса ввода?
От задачи к задаче подпункты могут быть разными, но постановка вопроса — половина решения.
В списке выше на самом деле можно выделить сразу два вида декомпозиции:
Вертикальная: сервер, перевод от команды переводчиков, реализация на клиенте.
И горизональная для приложения: подзадача про валидацию, про оформление, про хранение.
Разработчик с опытом может выдать ответ быстро, если он 1 000 раз проводил подобную декомпозицию. Но вот ответ от него может различаться от ответа джуниора, готового лезть на амбразуру сразу же.
Декомпозиция нужна, чтобы:
— Понять последовательность выполнения задач.
— Оценить сроки.
— Упростить процесс тестирования.
— Помочь расставить приоритеты. В спринте, но по-хорошему, изначально в бэклоге.
Два небольших вывода:
1️⃣ Мы работаем на бизнес. Поэтому мы должны понимать, почему менеджер может быть недоволен медленной оценкой.
2️⃣ Хочется верить, что этот пост прочтут не только разработчики, но и проект-менеджеры. Профессионалы улыбнутся и скажут, что так и есть. Но те, кто начинает управлять командами — пожалуйста, прочтите этот пост ещё раз.
Специально для @iOS Dev
Архитектура компилятора Swift — что там внутри?
Полезно знать, что представляет собой компилятор. Поверьте, эта тема намного глубже, и каждый из пунктов достоин отдельного доклада, но ниже попробую представить информацию в сжатом виде.
В целом, компилятор Swift в основном отвечает за трансляцию исходного кода Swift в эффективный исполняемый машинный код. Однако внешний интерфейс компилятора Swift также поддерживает ряд других инструментов, включая интеграцию с IDE с подсветкой синтаксиса, код-комплитом и другими удобствами.
Ниже приведу высокоуровневое описание основных компонентов компилятора Swift:
⚪ Парсинг
⚪ Семантический анализ
⚪ Импортер Clang
⚪ Генерация SIL (Swift Intermediate Language)
⚪ SIL-гарантированные преобразования
⚪ Оптимизации SIL
⚪ Генерация LLVM IR
📖 А вот детальнее про каждый со ссылками и небольшим разбором можно прочесть в моей статье на telegraph.
@iOS Dev — разбираем не только код!
Полезно знать, что представляет собой компилятор. Поверьте, эта тема намного глубже, и каждый из пунктов достоин отдельного доклада, но ниже попробую представить информацию в сжатом виде.
В целом, компилятор Swift в основном отвечает за трансляцию исходного кода Swift в эффективный исполняемый машинный код. Однако внешний интерфейс компилятора Swift также поддерживает ряд других инструментов, включая интеграцию с IDE с подсветкой синтаксиса, код-комплитом и другими удобствами.
Ниже приведу высокоуровневое описание основных компонентов компилятора Swift:
⚪ Парсинг
⚪ Семантический анализ
⚪ Импортер Clang
⚪ Генерация SIL (Swift Intermediate Language)
⚪ SIL-гарантированные преобразования
⚪ Оптимизации SIL
⚪ Генерация LLVM IR
📖 А вот детальнее про каждый со ссылками и небольшим разбором можно прочесть в моей статье на telegraph.
@iOS Dev — разбираем не только код!
This media is not supported in your browser
VIEW IN TELEGRAM
UIButton с контекстным меню
Контекстные меню встречаются часто и служат неплохим инструментом для взаимодействия пользователя с элементами нашего приложения.
Знали ли вы, что такое меню для кнопки можно добавить буквально несколькими строками?
1️⃣ В
2️⃣ А с помощью showsMenuAsPrimaryAction мы используем меню как замену обычному действию по кнопке.
Таким образом, UIButton будет действовать как кнопка меню, и вы сможете назначить свои собственные действия.
💡Небольшой совет: если вы будете использовать такой способ, то лучше показать пользователю, что здесь могут быть дополнительные действия. Например, с помощью многоточия (три точки, ellipsis в SF-символах).
@iOS Dev
Контекстные меню встречаются часто и служат неплохим инструментом для взаимодействия пользователя с элементами нашего приложения.
Знали ли вы, что такое меню для кнопки можно добавить буквально несколькими строками?
button.menu = getContextMenu()
button.showsMenuAsPrimaryAction = true
1️⃣ В
getContextMenu()
нужно вернуть UIMenu.2️⃣ А с помощью showsMenuAsPrimaryAction мы используем меню как замену обычному действию по кнопке.
Таким образом, UIButton будет действовать как кнопка меню, и вы сможете назначить свои собственные действия.
💡Небольшой совет: если вы будете использовать такой способ, то лучше показать пользователю, что здесь могут быть дополнительные действия. Например, с помощью многоточия (три точки, ellipsis в SF-символах).
@iOS Dev
Руководство для начинающих по массивам в Swift
Хочу сказать всем спасибо за то, что проголосовали в опросе❤️, удивительно много откликов, и это невероятно здорово!
Как обещал, я прочитал все отзывы, сделал себе заметки и даже построил себе план по запрошенным темам.
Одной из просьб, о которых вы просили — побольше материалов для новичков. Что ж, постараюсь насыщать контент канала и материалами для тех, кто только вкатывается в iOS-разработку.
📖 С помощью этой статьи вы узнаете, как манипулировать массивами в Swift на довольно неплохом уровне. Тут охватывается множество полезных методов, советов и приемов, связанных с массивами.
📖 А ещё вам может пригодится вот этот материал.
@iOS Dev
Хочу сказать всем спасибо за то, что проголосовали в опросе❤️, удивительно много откликов, и это невероятно здорово!
Как обещал, я прочитал все отзывы, сделал себе заметки и даже построил себе план по запрошенным темам.
Одной из просьб, о которых вы просили — побольше материалов для новичков. Что ж, постараюсь насыщать контент канала и материалами для тех, кто только вкатывается в iOS-разработку.
📖 С помощью этой статьи вы узнаете, как манипулировать массивами в Swift на довольно неплохом уровне. Тут охватывается множество полезных методов, советов и приемов, связанных с массивами.
📖 А ещё вам может пригодится вот этот материал.
@iOS Dev