«Приключение космического барахольщика» — квест по Swift и Kotlin от Tproger x Авиасейлс

Партнёрский материал. Что это?

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

Далёкое будущее. Программирование настолько плотно вошло в жизнь людей, что требуется буквально для любого дела, в том числе для управления транспортом. Вы сидите за штурвалом небольшого космического корабля и готовитесь вылетать на планету в соседней системе. Ваш корабль поддерживает Kotlin и Swift. На каком языке вам комфортнее общаться?

Tproger x Авиасейлс

Вы ввели код, и приятный голос Siri ответил: «Капитан, приветствую вас на борту!».

Вы ввели код, и приятный голос ответил: «Капитан, приветствую вас на борту! Отопительная система повреждена. Запускаю Android Studio, чтобы обеспечить комфортную температуру».

Через пару дней полёта вы засекли электромагнитное излучение. Добравшись до источника, вы обнаружили обломки массивного космического корабля. Один из обломков издавал сигнал, который вас сюда и привёл.

Вы затянули обломок на свой корабль — это оказалась странная коробочка с разъемами, которые вы не можете ни к чему подключить. Коробочка выглядит ценной… Может быть, за неё что-нибудь дадут там, куда направлялся разбившийся корабль?

Решите задание, чтобы рассчитать, куда летел корабль.

Какой метод вызывается только раз в жизненном цикле фрагмента?

Представим, что у нас есть модель профиля пользователя с необязательными полями. Свойство fullName должно формировать строку вида Имя Фамилия (через пробел).

struct Profile {
    
    let firstName: String?
    let lastName: String?
    
    var fullName: String {
        [firstName, lastName]
            .compactMap { $0 }
            .joined(separator: " ") // пробел между кавычек
    }
}
 
let profile = Profile(firstName: nil, lastName: nil)

Есть ли в этом коде ошибка, и что вернет значение свойства fullName для созданного в последней строке профиля?

Tproger x Авиасейлс

Вы ошиблись. При расчётах бортовой ИИ выдал: «Неизвестная ошибка». Вам придётся изучить обломки, чтобы узнать маршрут корабля. Внутри покореженного судна вы находите панель управления кораблем и получаете оттуда координаты точки назначения: колония B 5.5.

Вы ошиблись. При расчётах бортовой ИИ выдал: «Неизвестная ошибка». Вам придётся изучить обломки, чтобы узнать маршрут корабля. Внутри покореженного судна вы находите панель управления кораблем и получаете оттуда координаты точки назначения: колония B 1.5.30.

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

Вы уже собираетесь уходить, но видите закрытую дверь. Чтобы открыть ее, надо решить задание.

Есть многопоточный код, который выполняет несколько операций:

queue.async {
    sleep(1)
    print("Один")
}
 
queue.async {
    sleep(1)
    print("Два")
}
 
queue.async {
    sleep(1)
    print("Три")
}

В каком случае мы можем гарантировать, что они выполнятся в том порядке, в котором описаны — «Один Два Три»?

Как передать аргументы при создании фрагмента?

Tproger x Авиасейлс

Верно. Программа отработала без ошибок. Бортовой ИИ сообщил, что координаты места назначения корабля получены — это колония B 5.5.

Верно. Программа отработала без ошибок. Бортовой ИИ сообщил, что координаты места назначения корабля получены — это колония B 1.5.30.

Однако вы все еще можете исследовать корабль — вдруг там есть что-то важное?

Tproger x Авиасейлс

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

Вы ошиблись — дверь не поддалась, и вы решили уйти ни с чем.

Довольно быстро вы прибыли в место назначения. Это бедная колония, которая начала осваивать планету лет 15 назад, но дела идут не очень хорошо. Ресурсов не хватает, и переселенцы полностью зависят от внешних поставок.

В администрации космопорта благодарят за информацию о кораблекрушении, но ничего не знают о коробочке. Вы возвращаетесь к своему кораблю и видите ужасающее зрелище: колонисты уже наполовину растащили корабль на детали. Решите задание, чтобы найти украденные элементы и восстановить корабль.

Есть некий класс MyClass:

class MyClass {
    /// ...
}

Возможно ли объявить следующее свойство в extension?

extension MyClass {
    var name: String    
}

После вызова какого метода жизненного цикла фрагмент становится активным?

Tproger x Авиасейлс

Правильно. Вам пришлось побегать, но вы смогли собрать все потерянные детали и восстановить корабль.

К сожалению, ошибка. Вы потратили полдня на поиски, но так и не смогли восстановить корабль. Вы продаёте его остатки, чтобы выручить хоть немного денег.

В процессе вы встретили местного Спеца. Девушка узнала странную коробку, но не хочет вам помогать. Вы решили произвести на нее впечатление своими навыками программирования.

Какие классы quality of service есть в GCD?

Каким методом установки значения MutableLiveData нельзя пользоваться из фонового потока?

Tproger x Авиасейлс

Вы решаете произвести на нее впечатление и говорите: «А вы знаете, что default, background, utility, userInitiated, userInteractive — классы quality of service в GCD?». Девушка странно смотрит на вас, но приглашает в свою мастерскую.

Вы решаете произвести на нее впечатление и говорите: «А вы знаете, что методом setValue() нельзя пользоваться из фонового потока?». Девушка странно смотрит на вас, но приглашает в свою мастерскую.

Вы решаете произвести на неё впечатление и говорите: «А вы знаете, что serial и concurrent — классы quality of service в GCD?». Девушка закатывает глаза и говорит: «Вообще-то default, background, utility, userInitiated и userInteractive». Вам приходится заплатить ей круглую сумму, чтобы она ответила на ваши вопросы.

Вы решаете произвести на неё впечатление и говорите: «А вы знаете, что global и main — классы quality of service в GCD?». Девушка закатывает глаза и говорит: «Вообще-то default, background, utility, userInitiated и userInteractive». Вам приходится заплатить ей круглую сумму, чтобы она ответила на ваши вопросы.

Вы решаете произвести на неё впечатление и говорите: «А вы знаете, что default, high, low и background — классы quality of service в GCD?». Девушка закатывает глаза и говорит: «Вообще-то default, background, utility, userInitiated и userInteractive». Вам приходится заплатить ей круглую сумму, чтобы она ответила на ваши вопросы.

Вы решаете произвести на неё впечатление и говорите: ««А вы знаете, что методом postValue() нельзя пользоваться из фонового потока?». Девушка закатывает глаза и говорит: «Вы перепутали с setValue()». Вам приходится заплатить ей круглую сумму, чтобы она ответила на ваши вопросы 💸

Вы вспоминаете про флешку, которую нашли на транспортнике — там были данные о Спеце. Возможно, кто-то хранил их на случай, если девушка откажется сотрудничать. Что ж, время настало: показав девушке информацию, вы получаете недовольный взгляд и согласие ответить на ваши вопросы.

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

Ваш корабль не приспособлен для таких далёких путешествий: нужно искать межзвёздный паром или оставлять корабль на этой планете.

Воспользовавшись поиском Авиасейлс, вы остановились на таких вариантах:

Tproger x Авиасейлс

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

Пришлось оставить корабль и купить место в самолете. Вы превосходно выспались и перекусили брускеттами с морепродуктами из подповерхностного океана Энцелада. Правда, за это пришлось немало заплатить.

Пришлось оставить корабль и купить место в самолете. Вы урывками поспали на трехчасовых пересадках, а ваши коленки болят от узких кресел, но какая разница, если вы на месте, а ваш счёт почти не пострадал.

Вы превосходно выспались и перекусили брускеттами с морепродуктами из подповерхностного океана Энцелада. Правда, за это пришлось немало заплатить.

Вы урывками поспали на трехчасовых пересадках, а ваши коленки болят от узких кресел, но какая разница, если вы на месте, а ваш счёт почти не пострадал.

Вот и орбитальная станция, которая служит для Земли огромным космопортом, а заодно рынком и трущобами. Отсюда на Землю нужно спуститься на космическом лифте. На станции куча людей, вам с трудом удаётся найти карту, но не ясно, как её использовать. Решите задачу, чтобы разобраться с устройством девайса.

Вызовется ли метод execute() после вызова метода perform()?

class MyNewClass {
    
    class DelegateClass {
        func execute() {}
    }
    
    weak var delegate: DelegateClass?
    
    func perform() {
        delegate = DelegateClass()
        delegate?.execute()
    }
    
}
 
let myNewClass = MyNewClass()
myNewClass.perform()

Можно ли программно изменять настройки канала нотификаций?

Tproger x Авиасейлс

 

Всё верно. Вы разобрались со странной картой и вышли к лифту. Спуск был не из приятных, но это точно лучше, чем случайно воспользоваться грузоподъемником — говорят, некоторые бедолаги все еще так делают.

Ошибка. Вы отчаялись разобраться с картой, пошли наугад и наткнулись на трубу, очень похожую на лифт. А позже очнулись уже на Земле рядом с табличкой «Грузовой лифт. Не использовать для перевозки людей, опасно для жизни!». Ваши кости целы, но голова кружится, а думать стало сложно. В дальнейших задачах у вас будет на один вариант ответа больше.

Земля и раньше была похожа на муравейник, а теперь стала еще больше и хаотичнее. Самостоятельно вам тут не разобраться, и вы решаете использовать подборку гидов от Авиасейлс. Вы связываетесь с Милой, которая сейчас свободна и готова помочь с поиском.

Она проводила вас до нужного адреса и убежала по своим делам. Но дом выглядит нежилым, и никто не отвечает на ваш стук.

Tproger x Авиасейлс

Только вы разбежались, чтобы высадить дверь, как вас кто-то окликнул.

Вы решаете уйти: не ломать же дверь. Однако стоило вам отойти на несколько шагов, как вас кто-то окликнул.

Обернувшись, вы увидели старого робота.
— «𝟛д𝕡𝕒𝕓𝕔т𝕓𝕪йт𝕖, 𝕜𝕠г𝕠 𝕓ы ищ𝕖т𝕖?»
Упс, кажется, у вас трудности перевода. Попробуйте поменять кодировку робота, решив задачу.

Жёлтый UIView является дочерним (subview) к красному UIView (оба UIView представлены прямоугольниками). На жёлтом UIView добавлен обработчик жеста нажатия (UITapGestureRecognizer). В каком случае будет вызван обработчик нажатия?

Как получить результат работы корутины, запущенной методом launch?

Tproger x Авиасейлс

Вы закончили возиться с настройками.

— Скажи что-нибудь, пожалуйста, — просите вы.

— Здравствуйте. Меня зовут Гитпуш.

Сработало!

— Скажи что-нибудь, пожалуйста, — просите вы.

— ³дᵖᵃᵇᶜтᵇʸйтᵉ‧ ᴹᵉᴴя зᵒᵇʸт Гитпʸʷ.

Вышло не очень, но понимать робота можно и так, поэтому вы решили не терять время.

Робот замечает у вас в руках коробочку и спрашивает:

— Вы знаете, что это?

— Я здесь, чтобы узнать это и получить награду.

Гитпуш вздыхает и переминается с ноги на ногу:

— Я… не думаю, что могу рассказать вам сейчас… вы можете решить, что это глупость. Скажите, мистер искатель приключений, вы согласны доставить этот… предмет… тому, кто его очень ждет? Вы не только получите награду, но и сможете удовлетворить свое любопытство.

Куда деваться — вы соглашаетесь.

— Отлично! Одна загвоздка… Точку назначения поменяли, и теперь у меня нет координат. Но я знаю, где их достать! Пойдемте.

Tproger x Авиасейлс

Кто бы знал, что за координатами вам придется проникнуть на охраняемую территорию частного космопорта некой компании «Большие Ребята»…

Гитпуш, поскрипывая, проводит вас через сеть пустых коридоров. Вы шепчете:

— Может, у тебя есть с собой масло? Непонятно, как нас еще не засекли по этим звукам.

— Звуки трения металла здесь никого не удивят. А вот если вы сейчас не сконцентрируетесь — будем убегать под воющую сирену. Мы пришли.

— ³ᵇʸᵏи тᵖᵉᴴия ᴹᵉтᵃллᵃ здᵉᶜь ᴴиᵏᵒгᵒ ᴴᵉ ʸдиᵇят‧ ᴬ ᵇᵒт ᵉᶜли ᵇы ᶜᵉйчᵃᶜ ᴴᵉ ᶜᵏᵒᴴцᵉᴴтᵖиᵖʸᵉтᵉᶜь — бʸдᵉᴹ ʸбᵉгᵃть пᵒд ᵇᵒющʸю ᶜиᵖᵉᴴʸ‧ ᴹы пᵖиʷли‧

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

В каком из перечисленных случаев нужно изменить content compression resistance приоритет на максимальное значение (required) и в каком классе или структуре?

Представим, что в нашем приложении activity лежат в стеке в таком порядке А->В->С. С каким launch mode нужно вызывать activity С, если мы хотим, чтобы при отправке Intent в него новый экземпляр не создавался?

Tproger x Авиасейлс

Всё верно. Пришлось попотеть, но вы отключили сигнализацию и проникли в комнату управления полетами. Теперь у вас есть координаты пункта назначения.

Неправильно. Вот черт! Сирена все-таки завыла, а сразу за ней раздался топот охранников. Вы оцепенели и просто ждали своей участи: спрятаться все равно было некуда. Охранники оказались сговорчивыми, но вам пришлось откупиться дорогущим полотенцем. Зато теперь у вас есть координаты пункта назначения.

Хорошо, если бы был еще и корабль… Вы растерянно смотрите на робота.

— Мистер кожаный, мы же в космопорте. Пойдемте, у компании есть капсулы, которые могут доставить нас на место.

— 𝕄и𝕔т𝕖𝕡 𝕜𝕠ж𝕒ℍый, 𝕄ы ж𝕖 𝕓 𝕜𝕠𝕔𝕄𝕠п𝕠𝕡т𝕖. П𝕠йд𝕖𝕄т𝕖, 𝕪 𝕜𝕠𝕄п𝕒ℍии 𝕖𝕔ть 𝕜𝕒п𝕔𝕪лы, 𝕜𝕠т𝕠𝕡ы𝕖 𝕄𝕠г𝕪т д𝕠𝕔т𝕒𝕓ить ℍ𝕒𝕔 ℍ𝕒 𝕄𝕖𝕔т𝕠.

Опять придется играть в хакермена: взломайте летательную капсулу.

В каком варианте есть возможность наследовать классы, помеченные как public и open?

Какой максимальный размер данных можно передать через Intent?

Tproger x Авиасейлс

Всё верно. Пришлось попотеть, но вы отключили сигнализацию и проникли в комнату управления полетами. Теперь у вас есть координаты пункта назначения. Вы снова петляете по коридорам вместе с Ботом, возвращаетесь к своему кораблю и отправляетесь рассекать космические просторы.

Неправильно. Вот черт! Сирена все-таки завыла, а сразу за ней раздался топот охранников. Вы оцепенели и просто ждали своей участи: спрятаться все равно было некуда. Охранники оказались сговорчивыми, но вам пришлось откупиться дорогущим полотенцем. Зато теперь у вас есть координаты пункта назначения. Вы снова петляете по коридорам вместе с Гитпушем, возвращаетесь к своему кораблю и отправляетесь рассекать космические просторы.

Отлично, пробрались. Координаты установлены, отправление прошло успешно.

Да кто вообще ставит на дверь задачи по iOS вместо пароля?.. Придётся брутфорсить руками. Вы находите бесхозную железку неподалёку и разбиваете проход в капсулу. Получилось пробраться и улететь, но вас засекла камера наблюдения, и позже у вас будут проблемы со звёздной полицией.

Да кто вообще ставит на дверь задачи по Android вместо пароля?.. Придётся брутфорсить руками. Вы находите бесхозную железку неподалёку и разбиваете проход в капсулу. Получилось пробраться и улететь, но вас засекла камера наблюдения, и позже у вас будут проблемы со звёздной полицией.

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

Приборная панель показывает, что цель совсем близко. Решите задачу, чтобы приземлиться на нужный вам астероид и не разбиться.

Внутри класса объявлено свойство с модификатором доступа private(set).

class MapOrder {
    private(set) var carID: String?
}

Допускаем, что работаем внутри одного модуля. Где будет доступно данное свойство на чтение и изменение?

Какой из вариантов является примером «холодного» Observable?

Tproger x Авиасейлс

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

Треск, скрежет, грохот! И грубое приземление. Умирающая панель успела показать, что вы оказались не на том астероиде. Спустя несколько часов на ваш сигнал SOS прилетает небольшой дроид — он помогает починить корабль и снова взлететь.

Непонятно, как эта капсула ещё держится… Но у вас получилось увильнуть от очередного астероида и зайти на посадку.

Треск, скрежет, грохот! И грубое приземление. Умирающая панель успела показать, что вы оказались не на том астероиде. Спустя несколько часов на ваш сигнал SOS прилетает небольшой дроид — он помогает починить капсулу и снова взлететь.

В итоге вы прилетаете на здоровенный астероид, и вас встречает ещё один робот. Он обменивается с вашим спутником серией каких-то миганий и бибиканий, а потом долго влюбленными глазами смотрит на коробочку в ваших руках. Вы ощущаете, что держите что-то действительно ценное, и наконец узнаёте разгадку.

— Вы не представляете, как я рад компании! Когда меня перетащили на новую локацию, я думал, что будет с кем пообщаться, но тут только работы стало больше, а я так и остался один. Держу всё под контролем, строю новые механизмы, добываю руду для Больших Ребят… Я не хвастаюсь, я страдаю! Здесь всё автоматизировано, одиноко и скучно.

Однажды вот этот молодой челобот рядом с вами прилетел техосматривать меня, мы познакомились и пропищали до поздней ночи, это был просто подарок! Но еще большим подарком стала его идея по моему спасению и поддержке издалека. Теперь каждый год я отправляю ему флешку на транспортных кораблях, а он скачивает мне весь интернет Земли — фильмы, сериалы, книги, свежие мемы — и доставляет флешку обратно. Дайте же ее мне!

Tproger x Авиасейлс

Вы забираете горстку разномастных драгоценных камней и остаетесь переночевать, чтобы еще немного развлечь Бота. Но он, кажется, уже не нуждается в общении: рассматривает фотографии котиков, бормоча что-то про «пушистых правителей Вселенной».

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

Ещё больше интересных задач ждут вас в Авиасейлс. Оставьте контакты для ребят из HR и примите участие в розыгрыше Tproger-мерча — футболок и стикеров:

* Обязально к заполнению
Отправить заявку
Tproger x Авиасейлс

Рекламные публикации для бизнеса:
sales@tproger.ru, +7 916 559-71-10

Tproger