SwiftyGroup

@swiftynew


Собираю единомышленников для совместного изучения Swift, подготовки к собеседованиям и прокачивания скилов:)

Чат группы:
https://t.me/swiftygroup
@swiftygroup

Админ:
@VladimirBuik

SwiftyGroup

21 Oct, 07:25


Причина, по которой print(view.backgroundColor) выводит Optional(UIExtendedSRGBColorSpace 1 0 0 1), заключается в том, что изменение backgroundColor слоя напрямую влияет на свойство backgroundColor представления (UIView).

Вот подробное объяснение:

Изначальная установка цвета фона представления:
swift

view.backgroundColor = UIColor.green

Здесь вы устанавливаете свойство backgroundColor у UIView в зелёный цвет. Это означает, что и само представление, и его слой (CALayer) будут иметь зелёный фон.

Изменение цвета фона слоя:
swift

view.layer.backgroundColor = UIColor.red.cgColor

Здесь вы напрямую устанавливаете свойство backgroundColor у слоя (CALayer) в красный цвет. Это свойство типа CGColor, поэтому мы используем UIColor.red.cgColor.

Взаимосвязь между UIView и его CALayer:
В UIView, свойство backgroundColor является обёрткой над соответствующим свойством слоя (layer.backgroundColor).
Когда вы изменяете backgroundColor у слоя напрямую, это изменение отражается на уровне представления.
Поэтому, после установки view.layer.backgroundColor в красный цвет, свойство view.backgroundColor обновляется и начинает отражать это изменение.

Вывод значения backgroundColor:
swift

print(view.backgroundColor)


Когда вы печатаете view.backgroundColor, вы получаете текущий цвет фона представления.
Поскольку последний установленный цвет фона слоя — красный, view.backgroundColor теперь тоже красный.
Поэтому выводит Optional(UIExtendedSRGBColorSpace 1 0 0 1), что соответствует красному цвету с альфа-каналом 1 (полностью непрозрачный).

SwiftyGroup

18 Oct, 06:15


#квиз

SwiftyGroup

17 Oct, 07:19


Мок-собеседования — отличный способ подготовиться к реальным собеседованиям. Они помогают не только прокачать навыки общения и презентации, но и углубить понимание тех вопросов, которые часто задают на интервью.
Еще 18 мок-собесов, упорядоченных по грейдам, можно найти у меня в закрытом Notion подписавшись на Boosty🏴‍☠️(70-процентная скидка до конца недели)

SwiftyGroup

17 Oct, 07:14


Собеседование iOS Разработчика. Проектирование и лайфкодинг

Всем привет! 🤟

Сегодня в нашем выпуске очередное собеседование. На этот раз с новым форматом, который придумал Олег. Он совместно с собеседуемым смоделируют ситуацию совместной работы и спроектируют приложение.

В данном выпуске вы увидите по сути тот лайфкодинг, который вы можете наблюдать на повседневной работе. По ходу собеседования, так же спрашивают и теоретические вопросы, которые так или иначе по большей часте относятся к часто используемым кейсам в iOS разработке. Желаем приятного просмотра!

P.S Если у кого-то плохо работает YouTube, то для вашего удобства мы выложили собеседование на наш бусти.

💬 Телеграм-канал Олега

SwiftyGroup

16 Oct, 11:43


Как создать массив со слабыми ссылками?
#вопросы
подробнее:
https://habr.com/ru/articles/726320/

SwiftyGroup

10 Oct, 09:05


Swift 6 — это важный этап для каждого iOS-разработчика. С его выходом придется пересматривать код и вносить изменения в проекты. Чтобы облегчить процесс миграции и лучше понять нововведения, статьи на русском языке можно почитать в Boosty🏴‍☠️ или в удобном формате в закрытом Notion.

SwiftyGroup

10 Oct, 09:04


🔢 Подборка материалов для изучения Swift 6

Migrating to Swift 6
What's new in Swift 6.0?

Дополнение

Migrate your app to Swift 6
Swift 6
Announcing Swift 6

SwiftyGroup

09 Oct, 07:19


Обрабока касаний в ios
#вопросы

SwiftyGroup

08 Oct, 07:56


Всем привет!👋

Я заметил, что многие подписчики на Boosty🏴‍☠️ не отправили почту для доступа к закрытому Notion. Понял, что для вас важны только статьи на самом Boosty, поэтому запустил новый уровень подписки, который включает только статьи. 🎯

В честь старта нового уровня — скидка 50%! 🔥

SwiftyGroup

07 Oct, 08:47


Всем привет!👋
разбор пятничного квиза🕵️‍♂️:
1) Создание массива объектов MyClass:
На этом этапе создается массив firstMass, содержащий три объекта класса MyClass:
Первый объект: с именем "Andrey"
Второй объект: с именем "Viktor"
Третий объект: с именем "Lena"

2) Присваивание массива firstMass в secondMass:
Массивы в Swift являются типами значений. Это означает, что при присвоении одного массива другому создается копия этого массива. Однако, хотя массивы копируются по значению, объекты, хранящиеся в этих массивах, являются ссылочными типами (так как это экземпляры класса MyClass). Это приводит к тому, что при копировании массива создается новый массив, но ссылки на объекты остаются теми же.
То есть теперь:
firstMass и secondMass — это два разных массива, но оба массива содержат ссылки на одни и те же объекты (MyClass).

3) Удаление последнего элемента из firstMass:
Операция popLast() удаляет и возвращает последний элемент массива firstMass. После этого массив firstMass становится:
[MyClass(name: "Andrey"), MyClass(name: "Viktor")]
Однако, массив secondMass остается неизменным и по-прежнему содержит:
[MyClass(name: "Andrey"), MyClass(name: "Viktor"), MyClass(name: "Lena")]

4) Изменение имени последнего объекта в firstMass:
После удаления последнего элемента из firstMass, последним объектом в этом массиве становится объект с именем "Viktor". На этом этапе его имя изменяется на "Ivan". Теперь firstMass выглядит так:
[MyClass(name: "Andrey"), MyClass(name: "Ivan")]
Поскольку secondMass содержит ссылки на те же объекты, это изменение также отражается в массиве secondMass. Таким образом, массив secondMass теперь содержит:
[MyClass(name: "Andrey"), MyClass(name: "Ivan"), MyClass(name: "Lena")]

5)Вывод содержимого secondMass:
При выводе массива secondMass в консоль вызывается свойство description каждого объекта в массиве. Это свойство возвращает значение переменной name для каждого объекта. Поскольку изменения были произведены над объектом, на который ссылаются оба массива, в консоль выводятся актуальные имена:
Andrey
Ivan (измененное имя второго объекта)
Lena (имя третьего объекта, которое не изменилось)

SwiftyGroup

04 Oct, 12:32


Всем привет!🚬
Возможно, кто-то не в курсе или уже подзабыл, но вот уже почти год я работаю👨‍🍳 над книгой "100 вопросов для iOS разработчика" с ответами на самые популярные вопросы, которые задают на собеседованиях. Черновой вариант уже готов, и сейчас его проверяют несколько ревьюеров с опытом в iOS более 10 лет, чтобы материал был максимально качественным.

Недавно я узнал, что верстка и выпуск книги потребуют финансовых затрат💰 (неожиданно, да?), поэтому я принял решение запустить Boosty🏴‍☠️. Там я буду выкладывать переводы официальной документации по Swift, популярных статей, вопросы и ответы с реальных собеседований, а также полезные тулзы для удобной разработки.

Каждую неделю я буду обновлять и добавлять новый контент на Boosty, а сейчас там доступна подписка со скидкой 70%! И главное — все подписчики получат онлайн-версию книги абсолютно бесплатно и раньше всех!

Поддержите проект и будьте в числе первых, кто получит доступ к книге и полезному контенту.🤲

SwiftyGroup

04 Oct, 09:48


#квиз

SwiftyGroup

30 Sep, 08:29


Всем привет!👋
разбор пятничного квиза🕵️‍♂️:

1) Вызов функции (runTest):
Функция runTest является асинхронной (async), что означает, что она выполняется асинхронно при вызове.

2) Первый print("1"):
Первая строка print("1") выполняется сразу, поскольку перед ней нет никаких await. Это означает, что "1" будет выведено в консоль сразу.

3) Блок MainActor.run {}:
Оператор await перед MainActor.run приостанавливает выполнение функции до тех пор, пока главный поток (MainActor) не станет доступен.
Когда выполнение попадает в блок MainActor.run, код выполняется на главном потоке (MainActor), и строка print("2") выполняется первой внутри этого блока. В консоли будет выведено "2".

4) Создание задачи:
Внутри блока MainActor.run создается новая задача Task. Эта задача также помечена как выполняемая на главном потоке (@MainActor).
Однако задача не выполняется сразу, она ставится в очередь. Таким образом, print("3"), который находится внутри задачи, не выполнится немедленно.
Сразу после создания задачи выполняется print("4"), и в консоль выводится "4".

5) Выход из блока MainActor.run:
После завершения блока MainActor.run, выполнение продолжается с следующей строки после блока, где находится print("5"). Эта строка выполняется, и в консоль выводится "5".

6) Выполнение задачи:
После того как основная функция завершится, асинхронная задача, созданная ранее, наконец выполняется, и строка print("3") выводится в консоль.

PS: У меня две недели отпуск🥇, соответственно количество постов будет сокращено🔨, спасибо за понимание!