Комментарии 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!"))
Что-то я расписался. Спасибо за статью!
49 вопрос, некорректный пример кода, примеры идентичны
11. Как можно улучшить читаемость кода?
linter
С таким же успехом можно было добавить вопрос про git а ля "Как можно пошарить код на дцать человек". Та же история про симуляторы.
18. Для чего нужен оператор вида «??» ?
Учитывая что это не один оператор, а два довольно плохой ответ. Один unwrapит опционал, а второй это обычный тернарник из примера выше.
Каковы три основных типа коллекций в Swift?
Странно, что tuple внезапно оказался вне списка.
А как же вопросы про frame и bounds? Self, weak, unowned? GCD? Escaping closure? Не, ну это не серьезно)
Вот сижу и думаю что мне задать на собеседовании (первое, на котором я буду присутствовать в качестве интервьюера)
Вопросы про self/weak звучат как способ определить не соврал ли человек в резюме, что он видел язык в глаза хотя бы пока гуглил список частых вопросов на собеседовании. А вопрос про frame и bounds - определить, что он уже прошёл несколько собеседований или гуглил вопросы.
Вопрос про self/weak/unowned я наверное таки задам
Строго говоря, ответ на второй вопрос некорректен. Да, массивы - это структуры и передаются по значению. Но по значению передается только метаинформация. Сами данные никуда не передаются изначально. И когда вызывается arr2 = arr1, обе структуры будут ссылаться на одни и те же данные. Когда вызывается append - происходит операция copy on write на набор данных и после этого arr1 и arr2 будут ссылаться уже на разные области памяти с данными. Возможно есть какие-то оптимизации позволяющие хранить небольшие объемы данных на стеке, но соискателю имеет смысл знать как работает система в целом.
50 вопросов и ответов для собеседования по Swift в 2022 году