Мы, команда мобильной разработки в SimbirSoft, при создании iOS-приложений широко используем язык Swift – достаточно безопасный, быстрый и выразительный. Для тех, кто знаком со Swift, мы приготовили несколько головоломок–паззлеров. Попробуйте определить результат выполнения каждого фрагмента кода и поделитесь вашими результатами!
Сколько раз будет распечатан текст “foo was set”?
Продолжим с didSet: сколько раз будет распечатано “bar was set”?
Отсортируем Bool массив. Что выведет приведенный ниже код?
Каким будет результат приведённого ниже кода?
Поиграем с равенствами. Что мы увидим при исполнении приведённого ниже кода? Что будет, если заменить “===” на “==”?
Немного о полиморфизме. Что будет выведено в консоль?
Проверяем…
Напоследок довольно простой вопрос: будет ли здесь ошибка компиляции?
Итак, мы с вами рассмотрели несколько фрагментов кода и предположений относительно их выполнения, а также сравнили ожидания и реальность. Надеемся, что вам было интересно и полезно!
Пишите в комментариях, на сколько вопросов удалось ответить, не подглядывая, и над чем пришлось поломать голову) А если вы хотите проверить себя в других языках – пишите пожелания!
Паззлер №1
Сколько раз будет распечатан текст “foo was set”?
Варианты ответа:
- A. 1 раз
- B. 2 раза
- C. Ни разу
- D. Ошибка компиляции
- E. Ошибка выполнения
Ответ
didSet срабатывает не только при присваивании нового значения экземпляру структуры, но и при присваивании нового значения полю структуры.
Правильный ответ: B
didSet срабатывает не только при присваивании нового значения экземпляру структуры, но и при присваивании нового значения полю структуры.
Паззлер №2
Продолжим с didSet: сколько раз будет распечатано “bar was set”?
Варианты ответа:
- A. 1 раз
- B. 2 раза
- C. Ни разу
- D. Ошибка компиляции
- E. Ошибка выполнения
Ответ
Инициализация не вызовет метод didSet у свойства — его вызовет код в блоке defer.
Правильный ответ: A
Инициализация не вызовет метод didSet у свойства — его вызовет код в блоке defer.
Паззлер №3
Отсортируем Bool массив. Что выведет приведенный ниже код?
Варианты ответа:
- A. [false, false, true]
- B. [true, false, false]
- C. Ошибка компиляции
- D. Ошибка выполнения
Ответ
Bool не соответствует протоколу Comparable, поэтому запустить такой код не получится — будет ошибка Referencing instance method 'sort()' on 'MutableCollection' requires that 'Bool' conform to 'Comparable'
Правильный ответ: 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 держит ссылку даже после окончания “срока службы” исходного массива.
Правильный ответ: С
Будет выведено 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
Ответ
Оператор “===” возвращает Bool значение, показывающее, указывают ли две ссылки на один и тот же экземпляр объекта. Экземпляры разные, поэтому будет выведен false. А вот применить оператор “==” не получится: для этого нужно, чтобы класс соответствовал протоколу Equatable.
Правильный ответ: E
Оператор “===” возвращает Bool значение, показывающее, указывают ли две ссылки на один и тот же экземпляр объекта. Экземпляры разные, поэтому будет выведен false. А вот применить оператор “==” не получится: для этого нужно, чтобы класс соответствовал протоколу Equatable.
Паззлер №6
Немного о полиморфизме. Что будет выведено в консоль?
Варианты ответа:
- A. foo и bar
- B. bar и bar
- C. foo и foo
- D. Ошибка выполнения
Проверяем…
Ответ
Все дело в диспетчеризации методов в Swift: при обращении к методам, которые не являются частью протокола и добавлены к нему через расширение, используется прямой вызов.
Правильный ответ: A.
Все дело в диспетчеризации методов в Swift: при обращении к методам, которые не являются частью протокола и добавлены к нему через расширение, используется прямой вызов.
Паззлер №7
Напоследок довольно простой вопрос: будет ли здесь ошибка компиляции?
Варианты ответа:
- A. Да
- B. Нет
Ответ
Как ни странно, компилятор не позволит этого сделать. При этом со стандартами generic-типами это будет работать:
Правильный ответ: А.
Как ни странно, компилятор не позволит этого сделать. При этом со стандартами generic-типами это будет работать:
Вывод
Итак, мы с вами рассмотрели несколько фрагментов кода и предположений относительно их выполнения, а также сравнили ожидания и реальность. Надеемся, что вам было интересно и полезно!
Пишите в комментариях, на сколько вопросов удалось ответить, не подглядывая, и над чем пришлось поломать голову) А если вы хотите проверить себя в других языках – пишите пожелания!