Как стать автором
Обновить
81.7
SimbirSoft
Лидер в разработке современных ИТ-решений на заказ

Проверь себя в Swift: паззлер для любителей головоломок

Время на прочтение2 мин
Количество просмотров6K
Мы, команда мобильной разработки в SimbirSoft, при создании iOS-приложений широко используем язык Swift – достаточно безопасный, быстрый и выразительный. Для тех, кто знаком со Swift, мы приготовили несколько головоломок–паззлеров. Попробуйте определить результат выполнения каждого фрагмента кода и поделитесь вашими результатами!



Паззлер №1


Сколько раз будет распечатан текст “foo was set”?



Варианты ответа:


  • A. 1 раз
  • B. 2 раза
  • C. Ни разу
  • D. Ошибка компиляции
  • E. Ошибка выполнения

Ответ

Правильный ответ: B





didSet срабатывает не только при присваивании нового значения экземпляру структуры, но и при присваивании нового значения полю структуры.


Паззлер №2


Продолжим с didSet: сколько раз будет распечатано “bar was set”?



Варианты ответа:


  • A. 1 раз
  • B. 2 раза
  • C. Ни разу
  • D. Ошибка компиляции
  • E. Ошибка выполнения

Ответ

Правильный ответ: A





Инициализация не вызовет метод didSet у свойства — его вызовет код в блоке defer.


Паззлер №3


Отсортируем Bool массив. Что выведет приведенный ниже код?



Варианты ответа:


  • A. [false, false, true]
  • B. [true, false, false]
  • C. Ошибка компиляции
  • D. Ошибка выполнения

Ответ

Правильный ответ: C





Bool не соответствует протоколу Comparable, поэтому запустить такой код не получится — будет ошибка Referencing instance method 'sort()' on 'MutableCollection' requires that 'Bool' conform to 'Comparable'


Паззлер №4


Каким будет результат приведённого ниже кода?



Варианты ответа:


  • A. nil
  • B. Optional(ArraySlice([1, 2, 3, nil, nil]))
  • C. Optional(ArraySlice([1, 2, 3]))
  • D. Ошибка компиляции
  • E. Ошибка выполнения

Ответ

Правильный ответ: С





Будет выведено Optional(ArraySlice([1, 2, 3])), так как ArraySlice держит ссылку даже после окончания “срока службы” исходного массива.


Паззлер №5


Поиграем с равенствами. Что мы увидим при исполнении приведённого ниже кода? Что будет, если заменить “===” на “==”?



Варианты ответа:


  • A. true и false
  • B. false и false
  • C. false и true
  • D. true и true
  • E. false и ошибка компиляции
  • F. true и ошибка компиляции
  • G. Ошибка компиляции в обоих случаях
  • H. Ошибка компиляции и false
  • I. Ошибка компиляции и true

Ответ

Правильный ответ: E







Оператор “===” возвращает Bool значение, показывающее, указывают ли две ссылки на один и тот же экземпляр объекта. Экземпляры разные, поэтому будет выведен false. А вот применить оператор “==” не получится: для этого нужно, чтобы класс соответствовал протоколу Equatable.


Паззлер №6


Немного о полиморфизме. Что будет выведено в консоль?



Варианты ответа:


  • A. foo и bar
  • B. bar и bar
  • C. foo и foo
  • D. Ошибка выполнения


Проверяем…
Ответ

Правильный ответ: A.





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


Паззлер №7


Напоследок довольно простой вопрос: будет ли здесь ошибка компиляции?



Варианты ответа:


  • A. Да
  • B. Нет

Ответ

Правильный ответ: А.





Как ни странно, компилятор не позволит этого сделать. При этом со стандартами generic-типами это будет работать:




Вывод


Итак, мы с вами рассмотрели несколько фрагментов кода и предположений относительно их выполнения, а также сравнили ожидания и реальность. Надеемся, что вам было интересно и полезно!

Пишите в комментариях, на сколько вопросов удалось ответить, не подглядывая, и над чем пришлось поломать голову) А если вы хотите проверить себя в других языках – пишите пожелания!
Теги:
Хабы:
+7
Комментарии10

Публикации

Информация

Сайт
www.simbirsoft.com
Дата регистрации
Дата основания
Численность
1 001–5 000 человек
Местоположение
Россия