Pull to refresh

Comments 17

Спасибо!

Сейчас как раз учу свифт для общего развития, ваша статья помогла проверить себя на прогресс и узнать кое-что новое :)

Пожалуйста, здорово, что статья пригодилась!

Мой опыт - такие вопросы ничем не помогают в выявлении хорошего кандидата уровня мидл и выше.

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

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

А где-то утверждалось что-то про мидл уровень? Это же уже обычно этап когда знание языка не столь принципиально, сколько штуки про разработку/архитектуру приложений etс. Тут из таких вопросов только вопрос про MVC. Да и сложность вопросов тут вполне новичковая и если чуток подшаманить, то вообще можно использовать эти же вопросы для других языков типа TS/C#/Rust/Java.

Мой любимый Swift. Не серчайте, позвольте немного подушнить и вставить пару дополнений.

 

4. Какие потенциальные улучшения вы здесь видите?

Я бы ещё вместо turnTo(direction: Direction) использовал turn(to direction: Direction) для большего соответствия стилистике Apple.

А зачем default в case? В коде не подразумевается создание enum из rawValue, также логика исключает возникновение новой стороны света. Если бы новые стороны света можно было бы придумать, тогда логичнее было бы добавить @unknown default для возможных обновлений кода в будущем.

 

6. Что такое Optional в Swift? Как его создать?

Я думаю, самое хорошее объяснение, которое встречается почти везде, что Optional — это enum Optional<Wrapped>, принимающий одно из двух значений: none или some(Wrapped). Всякие ?, !, nil и прочие инструменты работы с optional в Swift — не что иное, как синтаксический сахар, чтобы каждый раз не пришлось писать такие конструкции. Такое объяснение сразу снимает и вопрос 41. Nil vs None в Swift.

 

17. Для чего нужны Protocols в Swift?

Вопрос был «для чего», хотя ответа я так и не прочитал. Как минимум, они нужны для возможности работы с дженериками. На мой взгляд, это также современный подход к и альтернатива для (множественного) наследования. Вообще, Protocol Oriented Programming — это целая архитектурная философия, то есть ещё и богатая почва для холивара. Поэтому вопрос с подвохом.

 

22. Можно ли поменять местами две переменные без третьей переменной-помощника?

Имхо не совсем корректный ответ, так как LLVM создаёт эту самую третью переменную уже на уровне SIL. Но зато на уровне оптимизаций ассемблера решение превращается в каноническое, с использованием XOR (инструкции xorl, если быть совсем точным). Так что я бы ответил так:

var a = 10

var b = 20

a = a^b

b = a^b

a = a^b

 

34. Что такое расширения?

Про extension для типов, отличных от протоколов, стоит отметить, что они очень часто используются для имплементации конкретного протокола. Extension может использоваться для выделения фрагмента кода, для которого нужно определить другую область видимости, например fileprivate. Extension с where используется для дополнения типов, основанных на дженериках, функциональностью, связанной с конкретными ограничениями той или иной реализации. Имхо, самые интересные возможности открывает extension для протоколов: позволяет делать реализацию по умолчанию, в том числе и "хранить значения", хотя в большинстве случаев это считается антипаттерном. Реализация по умолчанию - это хорошая замена фабрике, а ведь ещё можно и подобие полиморфизма из расширений протоколов реализовать...

 

49. Что такое (autoclosure) автозамыкание в Swift? Как и когда его следует использовать?

Вместо I_will(perform_action: явно лучше писать iWill(performAction:, так как это функция и в Swift принят CamelCase вместо snake_case.

А второй фрагмент кода забыли поправить:

func iWill(_ performAction: @autoclosure () -> Void) {performAction()}

iWill(print("Hello, world!"))

 

Что-то я расписался. Спасибо за статью!

Спасибо! Вынес в UPDATE ваш комментарий, это по факту целое дополнение к статье.
Второй фрагмент кода поправил.

Маленькая незначительная поправочка: правильно будет написать 'camelCase', потому что 'CamelCase' - это уже по сути 'PascalCase'. 🙃

49 вопрос, некорректный пример кода, примеры идентичны

11. Как можно улучшить читаемость кода?

linter

С таким же успехом можно было добавить вопрос про git а ля "Как можно пошарить код на дцать человек". Та же история про симуляторы.

18. Для чего нужен оператор вида «??» ?

Учитывая что это не один оператор, а два довольно плохой ответ. Один unwrapит опционал, а второй это обычный тернарник из примера выше.

Каковы три основных типа коллекций в Swift?

Странно, что tuple внезапно оказался вне списка.

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

А как же вопросы про frame и bounds? Self, weak, unowned? GCD? Escaping closure? Не, ну это не серьезно)

Вот сижу и думаю что мне задать на собеседовании (первое, на котором я буду присутствовать в качестве интервьюера)

Вопросы про self/weak звучат как способ определить не соврал ли человек в резюме, что он видел язык в глаза хотя бы пока гуглил список частых вопросов на собеседовании. А вопрос про frame и bounds - определить, что он уже прошёл несколько собеседований или гуглил вопросы.

Вопрос про self/weak/unowned я наверное таки задам

UFO just landed and posted this here

Строго говоря, ответ на второй вопрос некорректен. Да, массивы - это структуры и передаются по значению. Но по значению передается только метаинформация. Сами данные никуда не передаются изначально. И когда вызывается arr2 = arr1, обе структуры будут ссылаться на одни и те же данные. Когда вызывается append - происходит операция copy on write на набор данных и после этого arr1 и arr2 будут ссылаться уже на разные области памяти с данными. Возможно есть какие-то оптимизации позволяющие хранить небольшие объемы данных на стеке, но соискателю имеет смысл знать как работает система в целом.

Sign up to leave a comment.

Articles