Давайте знакомиться! Меня зовут Розалия Амирова и уже несколько месяцев я веду @ios_broadcast (возможно вы видели мое имя в подписи к постам)
В iOS разработке 4 года, прошла путь от стажера до ведущего разработчика. Работаю в Тинькофф.Бизнес, а еще являюсь лидером профессии в компании. Иногда выступаю, менторю коллег, развиваю сообщество и делюсь новостями по iOS разработке.
Живу в Иннополисе уже 6 лет. Увлечений много, например, спорт, в особенности горные лыжи, путешествия, настолки, гитара.
В iOS разработке 4 года, прошла путь от стажера до ведущего разработчика. Работаю в Тинькофф.Бизнес, а еще являюсь лидером профессии в компании. Иногда выступаю, менторю коллег, развиваю сообщество и делюсь новостями по iOS разработке.
Живу в Иннополисе уже 6 лет. Увлечений много, например, спорт, в особенности горные лыжи, путешествия, настолки, гитара.
🔥58👏8👍5🤩4👎2
Собеседование iOS разработчика: вопросы и задания
В статье ответы на самые популярные вопросы, которые задают на интервью
👉 Что такое optional? Какие способы развернуть optional вы знаете?
👉 Что работает быстрее — поиск по NSArray или NSSet?
👉 Многопоточность - что такое GCD и когда надо использовать Dispatch Groups?
👉 Отличия frame и bounds
👉 Паттерны программирования
👉 Отличия структуры от класса
👉 Виды ссылок
👉 Жизненный цикл приложения
👉 Жизненный цикл ViewController
#interview
В статье ответы на самые популярные вопросы, которые задают на интервью
👉 Что такое optional? Какие способы развернуть optional вы знаете?
👉 Что работает быстрее — поиск по NSArray или NSSet?
👉 Многопоточность - что такое GCD и когда надо использовать Dispatch Groups?
👉 Отличия frame и bounds
👉 Паттерны программирования
👉 Отличия структуры от класса
👉 Виды ссылок
👉 Жизненный цикл приложения
👉 Жизненный цикл ViewController
#interview
👍13👎3
Стоит ли переходить с UIKit на SwiftUI? Опыт СберМаркета
👉 Если вы собираетесь писать новый проект, то автор рекомендует этот фреймворк
👉 Если это старый проект, то можно переписать некоторые компоненты на UIKit, вынося их, для начала, в отдельные ViewController’ы, и добавляя с помощью addSubview в родительский VC, а после уже полностью переписывать на SUI и оборачивать в UIHostingController.
Сам по себе SwiftUI не страшен, но есть ещё неизведанные территории и редкие баги, с которыми можно справиться, если внимательно читать документацию. По скорости разработки SwiftUI по большей части обходит UIKit, хотя сначала нужно набить руку и познакомиться с фреймворком.
#ui
👉 Если вы собираетесь писать новый проект, то автор рекомендует этот фреймворк
👉 Если это старый проект, то можно переписать некоторые компоненты на UIKit, вынося их, для начала, в отдельные ViewController’ы, и добавляя с помощью addSubview в родительский VC, а после уже полностью переписывать на SUI и оборачивать в UIHostingController.
Сам по себе SwiftUI не страшен, но есть ещё неизведанные территории и редкие баги, с которыми можно справиться, если внимательно читать документацию. По скорости разработки SwiftUI по большей части обходит UIKit, хотя сначала нужно набить руку и познакомиться с фреймворком.
#ui
👍13👎6
Декларативный UI: определение, история и необходимость
Декларативное программирование — это парадигма программирования, в которой задаётся ожидаемый результат, а не способ его получения. Об истоках этой технологии, её отличиях от императивной парадигмы и удобстве её использования читайте в статье
#paradigms
Декларативное программирование — это парадигма программирования, в которой задаётся ожидаемый результат, а не способ его получения. Об истоках этой технологии, её отличиях от императивной парадигмы и удобстве её использования читайте в статье
#paradigms
👍8👎1
Регистрация аккаунта разработчика в Apple: что может пойти не так
История одной регистрации в Apple Developer Program, которая вместо двух недель затянулась на 3 месяца.
Бизнес-аналитик, который работал с этими задачами, дает пару практических советов:
👉 Получать D-U-N-S (ID компании для регистрации) лучше сразу через Apple
👉 Будет эффективнее не писать обращения в Apple, а заказывать обратные звонки. В телефонном разговоре проще решать все вопросы здесь и сейчас, а не ждать каждый раз ответа несколько дней
#apple
История одной регистрации в Apple Developer Program, которая вместо двух недель затянулась на 3 месяца.
Бизнес-аналитик, который работал с этими задачами, дает пару практических советов:
👉 Получать D-U-N-S (ID компании для регистрации) лучше сразу через Apple
👉 Будет эффективнее не писать обращения в Apple, а заказывать обратные звонки. В телефонном разговоре проще решать все вопросы здесь и сейчас, а не ждать каждый раз ответа несколько дней
#apple
👍3👎1
Speech Synthesis: Text To Speech in SwiftUI
Apple предоставляет библиотеку для синтеза речи во фреймворке AVFoundation. Реализовать можно с помощью двух классов AVSpeechUtterance and AVSpeechSynthesizer. Довольно просто 😎
#swift
Apple предоставляет библиотеку для синтеза речи во фреймворке AVFoundation. Реализовать можно с помощью двух классов AVSpeechUtterance and AVSpeechSynthesizer. Довольно просто 😎
#swift
👍17👎2
Window management in SwiftUI
В текущей итерации SwiftUI значительным изменением стало добавление API для управления окнами. Что нового:
👉 Поддержка нескольких окон проверяется с помощью переменной окружения
👉 Создание новое окно с помощью
👉 Создание группы с помощью
👉 Модицифицирование стиля с помощью windowStyle
👉 Создание menu bar app
#swiftUI
В текущей итерации SwiftUI значительным изменением стало добавление API для управления окнами. Что нового:
👉 Поддержка нескольких окон проверяется с помощью переменной окружения
@Environment(\.supportsMultipleWindows)
👉 Создание новое окно с помощью
Window
👉 Создание группы с помощью
WindowGroup
👉 Модицифицирование стиля с помощью windowStyle
👉 Создание menu bar app
#swiftUI
👍7👎1
What is a Tuple in Swift?
Tuples предоставляют способ сгруппировать несколько значений вместе, чтобы представить их как единое. В статье представлена подробная информация о Tuple.
Что важно помнить:
👉 Empty tuple - () или всем знакомый Void
👉 Tuple как Type alias:
👉 Tuple - типы значений, а значит при переприсвании они копируются
👉 Количество элементов в tuple можно узнать так:
#swift
Tuples предоставляют способ сгруппировать несколько значений вместе, чтобы представить их как единое. В статье представлена подробная информация о Tuple.
Что важно помнить:
👉 Empty tuple - () или всем знакомый Void
👉 Tuple как Type alias:
typealias PersonTuple = (String, Int)
👉 Tuple - типы значений, а значит при переприсвании они копируются
👉 Количество элементов в tuple можно узнать так:
Mirror(reflecting: tuple).children.count
#swift
🔥5👎1
3 Agile Principles for a Productive and Progressive Life (with Examples!)
А что если применить правила Agile в повседневной жизни?🤔
В статье примеры из жизни и 3️⃣ основных правила:
👉 Планирование путем разбиения большой задачи на более мелкие задачи
👉 Если задача вошла в планирование, то другая должна выйти
👉 Если задача была просрочена, то обязательно нужно проанализировать почему именно она была сделана не в срок
#оффтоп
А что если применить правила Agile в повседневной жизни?🤔
В статье примеры из жизни и 3️⃣ основных правила:
👉 Планирование путем разбиения большой задачи на более мелкие задачи
👉 Если задача вошла в планирование, то другая должна выйти
👉 Если задача была просрочена, то обязательно нужно проанализировать почему именно она была сделана не в срок
#оффтоп
👍6👎1
Routing in SwiftUI
В статье представлены 2 вида routing’a в приложениях на SwiftUI:
1. Router With Trigger Views
Способ основан на маршрутизаторе, который возвращает вложенные экраны для всех возможных навигационных маршрутов. Такой фрагмент кода экрана или View будет содержать внутри модификатор NavigationLink или .sheet. Маршрутизатор запоминает открытый флоу благодаря биндингу @state. Показанные экраны не зависят от кода навигации и места назначения, только от протокола маршрутизатора
2. Router with type-erased modifiers
Экраны хранят @state маршрутизатора, который отслеживает текущее флоу, и выполняют навигацию, когда маршрутизатор изменит это состояние
#swiftUI
В статье представлены 2 вида routing’a в приложениях на SwiftUI:
1. Router With Trigger Views
Способ основан на маршрутизаторе, который возвращает вложенные экраны для всех возможных навигационных маршрутов. Такой фрагмент кода экрана или View будет содержать внутри модификатор NavigationLink или .sheet. Маршрутизатор запоминает открытый флоу благодаря биндингу @state. Показанные экраны не зависят от кода навигации и места назначения, только от протокола маршрутизатора
2. Router with type-erased modifiers
Экраны хранят @state маршрутизатора, который отслеживает текущее флоу, и выполняют навигацию, когда маршрутизатор изменит это состояние
#swiftUI
👍4👎1
Dependency Injection in Swift 5
UPD: О том, как реализовать DI с использованием Swift 5
Property wrapper'ы, которое упрощают Dependency Injection с помощью атрибута
DI помогает писать менее связанный код без передачи параметров вручную, абстрагироваться от инициализации зависимостей и упростить тестирование
#swift
UPD: О том, как реализовать DI с использованием Swift 5
Property wrapper'ы, которое упрощают Dependency Injection с помощью атрибута
@Injected
. DI помогает писать менее связанный код без передачи параметров вручную, абстрагироваться от инициализации зависимостей и упростить тестирование
#swift
🔥6👎5👍1
The Chain of Responsibility Pattern in Swift (2 мин)
Цепочка ответчиков реализует возможность обработать запрос нескольким объектом. Отличным примером является концепция responder'ов.
UIKit запускается с элемента управления first responder, который активировал клавиатуру, а затем передает вызов вверх по цепочке до тех пор, пока компонент не сможет выполнить действие.
Шаблон цепочки ответчиков используется для достижения слабой связи при разработке программного обеспечения.
#patterns
Цепочка ответчиков реализует возможность обработать запрос нескольким объектом. Отличным примером является концепция responder'ов.
UIKit запускается с элемента управления first responder, который активировал клавиатуру, а затем передает вызов вверх по цепочке до тех пор, пока компонент не сможет выполнить действие.
Шаблон цепочки ответчиков используется для достижения слабой связи при разработке программного обеспечения.
#patterns
🔥5👍2👎2
Make swift ‘contains()’ and ‘filter()’ ready for iOS Development
Полезные расширения для поиска строк в массиве:
👉 partiallyContains() / partiallyContainsFilter() для поиска по части строки в массиве строк (‘arr’ в [‘array’])
👉 relaxedOrderContains() / relaxedOrderFilter()
для, например, ‘world hello’ on [“hello world”]
👉 flexibleFilter() для реализации "поиска по контактам", например "wo" в ["world", "hello world"]
#swift
Полезные расширения для поиска строк в массиве:
👉 partiallyContains() / partiallyContainsFilter() для поиска по части строки в массиве строк (‘arr’ в [‘array’])
👉 relaxedOrderContains() / relaxedOrderFilter()
для, например, ‘world hello’ on [“hello world”]
👉 flexibleFilter() для реализации "поиска по контактам", например "wo" в ["world", "hello world"]
#swift
🔥7👎2
Как Xcode 14 непреднамеренно увеличивает размер приложения
Среди других функций Xcode 14 по умолчанию отключил биткод - альтернативный способ упаковки приложения, при котором часть процесса сборки остается на стороне Apple после его отправки в App Store.
Простое объяснение заключается в том, что битовый код оптимизирует производственные сборки, частично за счет удаления двоичных символов. Без включения битового кода настройки сборки Xcode необходимо изменить, чтобы удалять двоичные символы.
Как удалить двоичные символы без биткода:
👉 Используя настройки сборки Xcode
👉 Используя скрипт
#xcode
Среди других функций Xcode 14 по умолчанию отключил биткод - альтернативный способ упаковки приложения, при котором часть процесса сборки остается на стороне Apple после его отправки в App Store.
Простое объяснение заключается в том, что битовый код оптимизирует производственные сборки, частично за счет удаления двоичных символов. Без включения битового кода настройки сборки Xcode необходимо изменить, чтобы удалять двоичные символы.
Как удалить двоичные символы без биткода:
👉 Используя настройки сборки Xcode
👉 Используя скрипт
#xcode
👍6
Как настроить Charles
Приложение Charles Proxy - большой помощник и тестировщику, и разработчику. Для меня бывает особенно полезно, когда нужно подменить данные с бэка или подебажить приложение. Об установке, настройке и интерфейсе читайте в статье
#tools
Приложение Charles Proxy - большой помощник и тестировщику, и разработчику. Для меня бывает особенно полезно, когда нужно подменить данные с бэка или подебажить приложение. Об установке, настройке и интерфейсе читайте в статье
#tools
👍8
Как устроено приложение Календарь в iPhone
Разбор реализации календаря. Навигация, экраны, Accessibility
#iOS
Разбор реализации календаря. Навигация, экраны, Accessibility
#iOS
👍9👎1
Обзор новых API навигации в SwiftUI
SwiftUI имеет новые API-интерфейсы навигации в iOS 16 и macOS 13 на основе стека и по нескольким столбцам:
👉 NavigationStack состоит из корневого вью, у которого могут быть дополнительные вью, “накладываемые” поверх него, тем самым создавая стек. Обычно используем для приложений, работающих на iPhone
👉 Программная навигация в NavigationStack. Создаем переменную State, содержащую путь навигации, и передаем привязку к ней в NavigationStack
👉 NavigationSplitView. Обычно это боковая панель слева, где пользователь может выбирать элементы, которые будут отображаться в подробном виде справа. Используем для iPad или Mac
👉 NavigationSplitView с тремя колонками
#swiftUI
SwiftUI имеет новые API-интерфейсы навигации в iOS 16 и macOS 13 на основе стека и по нескольким столбцам:
👉 NavigationStack состоит из корневого вью, у которого могут быть дополнительные вью, “накладываемые” поверх него, тем самым создавая стек. Обычно используем для приложений, работающих на iPhone
👉 Программная навигация в NavigationStack. Создаем переменную State, содержащую путь навигации, и передаем привязку к ней в NavigationStack
👉 NavigationSplitView. Обычно это боковая панель слева, где пользователь может выбирать элементы, которые будут отображаться в подробном виде справа. Используем для iPad или Mac
👉 NavigationSplitView с тремя колонками
#swiftUI
👍5👎1
Жизненный цикл UIViewController
Вспомним и закрепим еще раз с наглядной схемой:
👉 init
👉 loadView - создание view
👉 viewDidLoad - viewController создан, Outlets на месте
👉 viewWillAppear - view будет добавлено в иерархию отображения
👉 viewWillLayoutSubViews - каждый раз, когда изменяется frame
👉 viewDidLayoutSubviews - view только что разместило свои subview
👉 viewDidAppear - после того, как ViewController появляется на экране
👉 viewWillDisappear - до того, как viewController будет удален с экрана
👉viewDidDisappear - после удаления viewController'a с экрана
👉 deinit
#ui
Вспомним и закрепим еще раз с наглядной схемой:
👉 init
👉 loadView - создание view
👉 viewDidLoad - viewController создан, Outlets на месте
👉 viewWillAppear - view будет добавлено в иерархию отображения
👉 viewWillLayoutSubViews - каждый раз, когда изменяется frame
👉 viewDidLayoutSubviews - view только что разместило свои subview
👉 viewDidAppear - после того, как ViewController появляется на экране
👉 viewWillDisappear - до того, как viewController будет удален с экрана
👉viewDidDisappear - после удаления viewController'a с экрана
👉 deinit
#ui
🔥19👎2👍1
Bottom sheet: Navigation
В статье описано, как создать полноценную навигацию в рамках bottom sheet отображения, основанного на autolayout, а не на неудобном ручном расчёте высоты. Повторили анимации навигационных переходов. Добавили navigation bar как нативный способ управления навигацией.
#ui
В статье описано, как создать полноценную навигацию в рамках bottom sheet отображения, основанного на autolayout, а не на неудобном ручном расчёте высоты. Повторили анимации навигационных переходов. Добавили navigation bar как нативный способ управления навигацией.
#ui
👍10👎2