Swift iOS Interview Вопросы и ответы – Часть 1 – Особенности языка

Перевод статьи https://ishtiz.com/swift/swift-ios-interview-questions-and-answers-part-1

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

В: Что такое mutating function в Swift?
О: Понимание mutating function зависит от понимания reference и value типов. В Swift свойства value type не могут быть изменены в его методах экземпляра по умолчанию. Вам нужно использовать ключевое слово mutating в методе экземпляра, чтобы изменить значение свойства value type. Mutating function может изменять значения свойств.
Подробнее здесь.

В: Зачем структуре нужна mutating function?
О: Вам нужно использовать mutating function, если вы хотите изменить какое-либо свойство, содержащееся в структуре. Вызов изменяющей функции не возвращает новую структуру. Это работает так же, как передача inout параметра в функцию. Ключевое слово mutating сообщает вызывающей стороне, что метод собирается изменить значение.

import Foundation

func address(o: UnsafeRawPointer) -> Int {
    return unsafeBitCast(o, to: Int.self)
}

struct Post {
    var title: String

    mutating func rename(new title: String) {
        self.title = title
    }
}

var post = Post(title: "Зачем структуре нужна mutating function?")

print(NSString(format: "%p", address(o: &post))) // выводит 0x104d742c0
post.rename(new: "Новый заголовок")
print(NSString(format: "%p", address(o: &post))) // выводит 0x104d742c0

В: В чем разница между Self и self?
О: Self – относится к любому типу, соответствующему протоколу, в то время как self относится к любому значению, которое содержит тип.
Подробнее здесь.

В: Что такое optional chaining(опциональная цепочка) в Swift?
О: Optional chaining — это процесс получения свойств объектов. Сила необязательного объединения в цепочку заключается в том, что разработчик может объединить несколько запросов вместе, но если какое-либо звено в цепочке равно nil, то вся цепочка генерирует nil. Необязательная цепочка обеспечивает ценность, если вся цепочка выполнена успешно.

//
let title: String? = article?.part?.title
//

В: Что такое операторы передачи управления в Swift?
О: Break, continue, fallthrough, return, throw

В: Что такое ленивая инициализация в Swift? / Что такое ленивая хранимая процедура в Swift и когда она используется?
О: Начальное значение лениво сохраненных свойств вычисляется только при первом вызове свойства.

В: Что такое defer?
О: Defer — это блок кода, который будет выполняться в случае выхода из текущей области выполнения(scope).

В: В чем преимущество использования оператора guard?
О: Есть два основных преимущества использования оператора guard. Первый — досрочно проверить опциональные переменные и не допустить вложенности операторов let друг в друга. Другим преимуществом является обеспечение раннего выхода из функции с помощью возврата.

В: Что такое вариативный параметр?
О: Вариативный параметр принимает ноль или более значений указанного типа. При создании API это кажется более удобным для разработчиков, поскольку нам не нужно генерировать массив при передачи нескольких аргументов.
Подробнее здесь.

В: Что такое ключевое слово final в классе?
О: Добавляя ключевое слово final перед именем метода/класса, мы предотвращаем возможность переопределения метода/наследования класса(пр. пер. – а так же меняем диспетчеризацию на статическую).

В: В чем преимущество .xib или Storyboad?
О: Если несколько человек работают над одной и той же Storyboad, возникнут конфликты, которые будет трудно решить(пр. пер. – очень сомнительный вопрос :)).

В: В чем разница между static и final?
О: Static переменная/функция является общей для всех экземпляров класса и используется для свойства/метода, к которому можно получить доступ без создания экземпляра класса, а final — это модификатор, который не может быть унаследован другими.

В: В чем разница между модификаторами open и public?
О: Модификатор open позволяет другим модулям использовать класс и наследовать его. Свойство открытого класса может быть переопределено другими модулями. Модификатор public позволяет другим модулям использовать общедоступные классы, но не позволяет быть подклассом или переопределения.

В: В чем разница между операторами == и === в Swift?
О: Основное различие между операторами == и === заключается в том, что оператор равенства «==» сравнивает типы значений, чтобы проверить, совпадают ли значения, а оператор тождества «===» сравнивает объекты для проверки указывают ли они на один и тот же экземпляр.

В: Почему мы не можем объявить структуру открытой(open)?
О: Потому что наследование между структурами невозможно. Модификатор open означает, что вы можете переопределить родительский метод/свойство данного класса вне модуля.

В: В чем разница между уровнем доступа fileprivate, private и public private(set)?
О: Fileprivate доступен в текущем файле, private доступен внутри текущего класса, public private(set) означает, что геттер является общедоступным, а сеттер — частным.

В: Что такое internal?
О: Модификатор internal позволяет использовать сущности в любом исходном файле из определяющего их модуля, но не в любом исходном файле за пределами модуля. Внутренний доступ(internal) — это уровень доступа по умолчанию.

В: Объясните разницу между struct и class в Swift?
О:  Cтруктуры являются типами значений, тогда как классы являются ссылочными типами. Когда вы копируете структуру, вы получаете две уникальные копии данных. Когда вы копируете класс, вы получаете две ссылки на один экземпляр данных.

В: Что такое value type и reference type в Swift?
О: Тип значения содержит данные в своей собственной памяти. Ссылочный тип содержит указатель на другую область памяти, в которой хранятся фактические данные.
Подробнее здесь.

В: В чем разница между assign и retain?
О: Assign элементы получают выделенное место в памяти, в то время как retain элементы зависит от жизненного цикла чего-то более высокого по иерархии.

В: Каков простой способ реализовать абстракцию в вашем проекте?
О: Использование протоколов и раздельные модули.

В: Что такое функция первого класса?
О: Говорят, что язык программирования, такой как Swift, имеет функции первого класса, когда функции в этом языке обрабатываются как любая другая переменная.
Подробнее здесь.

В: В чем разница между делегатами(Delegates) и обратными вызовами(Callbacks)?
О: Делегирование просто означает, что вы передаете себя кому-то другому, когда хотите, чтобы кто-то уведомил вас об изменениях, чтобы вы могли отреагировать на них. Например, если ViewController взаимодействует с сетевой службой и хочет получить уведомление, когда эта служба выполняет какой-либо запрос, он сделает себя делегатом сетевой службы. Затем сетевая служба вызовет методы делегата, когда это будет сделано.
Обратные вызовы аналогичны по функциям шаблону делегата. Они делают одно и то же: сообщают другим объектам, когда что-то произошло, и передают данные.
Что отличает их от шаблона делегата, так это то, что вместо передачи ссылки на себя вы передаете функцию.

В: В чем разница между guard и if let?
О: If let и guard – оба разворачивают опционал, если он содержит значение. Guard let обычно используется для раннего выхода из текущей области, поэтому любые значения, которые вы разворачиваете с его помощью, останутся после проверки. При использовании if let значение необходимо использовать внутри области if.

В: Что такое copy on write?
О: Копирование при записи(copy-on-write, COW) — это стратегия, используемая в Swift для оптимизации использования памяти. Основная идея COW заключается в том, что когда несколько вызывающих источников хотят получить доступ к одинаковым ресурсам, вы можете указать им один и тот же ресурс. Состояние ресурса будет поддерживаться до тех пор, пока вызывающая сторона не попытается изменить свою «копию» ресурса.
Подробнее здесь.

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

//

// Без синтаксиса завершающего замыкания
func greeting(title: String, greetingCallBack: () -> ()) {
    print("Hello world, \(title)")
    greetingCallBack()
}

// С синтаксисом завершающего замыкания
func greeting(title: String) {
    print("Hello world, \(title)")
}

//

В: Что такое associated type?
О: Associated type в Swift дает имя-заполнитель для типа, который будет использоваться как часть протокола. Когда протокол соответствует, указывается фактический тип, который будет использоваться для этого. Связанный тип делает протокол универсальным, предоставляя заполнитель типа.
Подробнее здесь.

В: Когда использовать множество, а не массив в Swift?
О: Мы должны использовать множество, когда элементы являются уникальными и доступны для использования, и нас не волнует порядок элементов. Массив позволяет дублировать элементы.

В: Что такое inout параметр?
О: Inout параметры могут быть обновлены внутри функции. Обновленное значение заменяет исходное значение вне функции.
Подробнее здесь.

В: В чем разница между upcast и downcast в Swift?
О: В Swift восходящее преобразование будет проверяться во время компиляции, и оно переходит от производного класса к базовому классу. Восходящее преобразование — это приведение к супертипу, а понижение — к подтипу. Восходящее приведение всегда разрешено, но понижающее приведение требует проверки типа. Мы можем понизить уровень, используя необязательный параметр as? или принудительный отказ с помощью as!.

В: В чем разница между as?, as! и as в Swift?
О: – as – используется для повышения типа
– as? – создает опционал, выдаст nil, если приведение не может быть выполнено успешно
– as! – не создает опционал, создается значение указанного типа, программа выйдет из строя, если приведение не может быть выполнено успешно.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *