Поиск по сайту:
Сила характера не в том, чтобы ломать других, а том, чтобы сломать себя! (Ю. Поляков).

10 лучших вопросов и ответов для собеседования по Swift в 2024 году

31.07.2024
10 лучших вопросов и ответов для собеседования по Swift в 2024 году

Apple представила язык программирования Swift в 2014 году как современный, безопасный и быстрый язык, предназначенный для простого изучения и использования. Он сочетает в себе элементы из различных языков программирования, таких как Objective-C, C, Python и других, при этом представляя новые функции.

Хотя он в основном используется для разработки на iOS и macOS, он также набирает популярность для кроссплатформенной разработки.

 

10 лучших вопросов для интервью Swift

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

 

Вопрос 1. В чем разница между let и var?

В Swift ключевые слова let и var используются для объявления констант и переменных соответственно.

 

Ключевое слово let

Мы объявляем константу с помощью let ключевого слова. Поскольку константу нельзя изменить после инициализации, мы должны присвоить ей значение при ее объявлении.

Пример использования ключевого слова let:

let standard = 100.1
let name: String = "AndreyEx"
print("Printing float value ",standard)
print("Printing string value ",name)
//standard = 200.2
//print("Printing float value after change",standard)

 

Объяснение кода:

  • Строка 1: Мы объявляем константу с именем standard, которая содержит значение с плавающей запятой.
  • Строка 2: Мы объявляем константу с именем, name которая содержит String значение.
  • Строки 4-5: Мы печатаем их значения.

 

Примечание: Попробуйте раскомментировать код в строках 6-7 и выполните код. Мы получим ошибку компиляции, заключающуюся в том, что мы не можем присвоить значение константе.

 

Ключевое слово var

Мы объявляем переменную с помощью var ключевого слова. Значение, присвоенное переменной, может быть изменено в любое время. Переменная может быть объявлена без начального значения и присвоена позже.

Пример использования ключевого слова var:

var standard = 100.1
var name: String = "AndreyEx"
print("Printing float value ",standard)
print("Printing string value ",name)
standard = 200.2
name = "Educative"
print("Printing float value after change",standard)
print("Printing string value after change",name)

 

Объяснение кода:

  • Строки 1-2: Мы объявляем две переменные с именами standard и name.
  • Строки 4-5: Мы печатаем значения для standard и name переменных.
  • Строки 7-8: Мы переназначаем значения переменным.
  • Строки 10-11: Мы печатаем значения переменных standard и name снова после внесения изменений.

 

Вопрос 2. Что такое вывод типа в Swift?

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

Пример использования вывода типов:

let number1 =100
let number2 =200.356
var message ="Educative"
print(type(of: number1))
print(type(of: number2))
print(type(of: message))

 

Объяснение кода:

  • Строки 1-3: Мы объявляем три переменные: number1, number2 и message. Мы присваиваем им целочисленные значения, значения с плавающей запятой и строковые значения соответственно.
  • Строки 5-7: Мы печатаем тип данных трех переменных с помощью функции type(of : variable).

 

Когда мы выполняем код, мы видим типы данных, напечатанные как Int, Double и String.

 

Вопрос 3. Что такое кортеж в Swift?

Кортеж – это облегченная структура данных, которая может группировать несколько значений в одно составное значение. Она может содержать любую комбинацию значений разных типов. Они обычно используются в Swift для функций, которым необходимо возвращать несколько значений, или при работе с API, которые возвращают несколько значений. Они предоставляют удобный способ группировать связанные значения без определения пользовательской структуры данных, такой как класс или struct.

Читать  Вопросы для собеседования на Python

Пример использования кортежа:

let sampleTuple = (1000, "Educative", true)
let val1 = sampleTuple.0
let val2 = sampleTuple.1
let val3 = sampleTuple.2  
print("Printing values using index of elements of the tuple.")
print(val1);
print(val2);
print(val3);
let namedTuple = (age: 22, name: "AndreyEx")
let age = namedTuple.age    
let name = namedTuple.name    
print("Printing values using named elements of tuple.")
print(age);
print(name);

 

Объяснение кода:

  • Строки 1: Мы создаем кортеж с именем sampleTuple с тремя значениями.
  • Строки 2-4: Мы получаем доступ к значениям кортежа, используя индекс элементов.
  • Строки 5-8: Мы выводим полученные значения с использованием точечной записи.
  • Строка 10: Мы создаем кортеж namedTuple с именованными элементами.
  • Строки 11-12: Мы получаем доступ к значениям кортежа, используя названия элементов.
  • Строка 13-15: Мы печатаем значения, полученные с использованием именованных элементов.

 

Вопрос 4. В чем разница между операторами == и === в Swift?

В Swift есть два оператора сравнения: == и ===.

Оператор ==

Оператор == проверяет, равны ли два значения по содержанию. Он выполняет проверку значений сравниваемых переменных или констант. Обычно используется для сравнения встроенных типов, таких как Int, String, Double и т.д. Однако его также можно использовать для сравнения экземпляров пользовательских типов, если они соответствуют Равному протоколу.

Пример использования оператора ==:

let a = 5
let b = 5
if a == b {
    print("They are equal")
}

struct Student: Equatable{
    var age: Int
    var name: String
}

let student1 = Student(age:22, name:"AndreyEx")
let student2 = Student(age:22, name:"AndreyEx")
let student3 = Student(age:25, name:"AndreyEx")
if student1 == student2 {
    print("student1 and student2 are equal")
}

if student2 == student3 {
    print("student2 and student3 are equal")
}

 

Объяснение кода:

  • Строки 1-5: Мы объявляем две переменные, a и b, и печатаем сообщение, только если они равны.
  • Строки 7-10: Мы создаем структуру с именем Student с двумя значениями: age и name. Это соответствует Equatable протоколу.
  • Строки 12-14: Мы создаем три объекта student с student1 и student2 одинаковыми возрастом и именем и student3 разными age.
  • Строки 16-18: Мы сравниваем student1 и student2 и печатаем сообщение только в том случае, если они равны.
  • Строки 20-22: Мы сравниваем student2 и student3 и печатаем сообщение только в том случае, если они равны.

 

Оператор ===

Оператор === проверяет, относятся ли две переменные или константы к одному и тому же экземпляру памяти. Его также называют оператором идентификации. В основном используется для классов и функций, чтобы проверить, указывают ли две ссылки на один и тот же экземпляр.

Пример использования оператора === :

class Student {
}
let student1 = Student()
let student2 = student1
if student1 === student2 {
    print("They are the same objects.")
}

 

Объяснение кода:

  • Строки 1-2: Мы создаем пустой Student класс.
  • Строка 3-4: Мы создаем Student объект с именем student1, а затем создаем новый объект, student2 который указывает на student1.
  • Строки 6-8: Мы сравниваем два объекта с помощью оператора идентификации и печатаем сообщение, если они равны.

 

Вопрос 5. Что такое for-in цикл в Swift?

for-in Цикл используется для перебора последовательности или коллекций, таких как массивы, наборы, словари и т.д. Мы можем выполнить набор инструкций для каждого элемента в последовательности. Его также можно использовать для доступа к индексу и значению каждого элемента в массиве с помощью enumerated() метода.

Читать  Python против Java в 2019 году

Пример использования цикла for-in :

let countries = ["USA", "Canada", "England"]
for country in countries {
    print(country)
}
for (index, letter) in "Educative".enumerated() {
    print("Index \(index) has letter \(letter) ")
}

 

Объяснение кода:

  • Строка 1: Мы создаем массив, содержащий названия стран.
  • Строки 2-4: Мы обходим массив с помощью цикла for-in и печатаем его элементы по отдельности.
  • Строки 6-8: Мы обходим слово Educative и печатаем каждый индекс и букву в этом индексе.

 

Вопрос 6. Что такое закрытие в Swift?

Мы можем определить замыкания как автономные функциональные блоки, которые можно передавать по кругу и использовать в коде. Они очень похожи на лямбды в других языках программирования. Мы можем фиксировать и сохранять ссылки на константы и переменные из контекста, в котором определяются замыкания.

Пример использования замыканий:

////////////Пример 1////////////////////////////
let multiply = { (val1: Int, val2: Int) -> Int in
    return val1 * val2
}
print(multiply(5, 100))

////////////Пример 2////////////////////////////
func transform(_ numbers: [Int], with logic: (Int) -> Int) -> [Int] {
    var result = [Int]()
    for number in numbers {
        let transformedValue = logic(number)
        result.append(transformedValue)
    }
    return result
}
let numbers = [11, 21, 31, 41]
let modifiedNumbers = transform(numbers) { $0 * 2 }
print(modifiedNumbers)

 

Объяснение кода:

  • Строки 2-4: Мы создаем замыкание, multiply которое принимает два значения и умножает их друг на друга.
  • Строка 5: Объявляем закрытие и печатаем его результат.
  • Строки 8-15: Мы определяем функцию transform, которая принимает массив целых чисел и замыкание, определяющее способ преобразования каждого элемента.
  • Строка 16: Мы создаем массив из целых чисел.
  • Строка 17: Мы вызываем функцию transform, предоставляя массив целых чисел и используя сокращенный синтаксис замыкания. Мы определяем замыкание таким образом, чтобы оно умножало каждое значение на 2.
  • Строка 18: Мы печатаем возвращаемый массив из функции.

 

Вопрос 7. Какие протоколы существуют в Swift?

Протокол – это соглашение о методах, свойствах и других требованиях, которые соответствуют определенной функциональности. Классы, структуры и перечисления могут соответствовать протоколу, обеспечивающему реальную реализацию этих требований. Мы можем рассматривать их как интерфейсы в других языках программирования. Использование протоколов повышает гибкость кода и возможность повторного использования.

Пример использования протокола:

protocol Info {
    var name: String { get set }
    var age: Int { get set }
    func printBio()
}

class Student: Info {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

 
    func printBio() {
        print("Student's name is \(name) and he is \(age) years old.")
    }
}

let student = Student(name: "AndreyEx", age: 20)
student.printBio()

 

Объяснение кода:

  • Строки 1-5: Мы определяем протокол, Info с двумя свойствами name и age, и метод printBio.
  • Строки 7-19: Мы создаем Student класс, соответствующий Info протоколу. Мы предоставляем реализацию метода printBio.
  • Строка 20: Мы создаем объект student с именем AndreyEx и возрастом 20.
  • Строка 21: Мы вызываем метод printBio объекта student.

 

Вопрос 8. Какова цель знака ?? в Swift?

Двойной вопросительный знак ?? в Swift называется оператором объединения нулевых значений. Он обеспечивает точный способ задать значение по умолчанию для необязательного параметра if nil. Предположим, у нас есть выражение x ?? y. Затем выражение принимает значение, равное x если x не равно нулю, и выражение принимает значение, равное y если x равно нулю.

Читать  Установка Go в Debian за 4 простых шага

Пример использования оператора ??:

let x: Int? = nil
let y = 100
let result = x ?? y
print(result)

 

Вопрос 9. Что такое дженерики в Swift?

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

Примеры использования дженериков в Swift:

func swapValues<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}

var x = 5
var y = 10

print("Before swap x = \(x) and y = \(y)")
swapValues(&x, &y)
print("After swap x = \(x) and y = \(y)")
var greeting = "Hello"
var company = "Educative"

print("Before swapping greeting = \(greeting) and company = \(company)")
swapValues(&greeting, &company)
print("After swapping greeting = \(greeting) and company = \(company)")

 

Объяснение кода:

  • Строки 1-5: Мы определяем универсальную функцию swapValues, которая может менять местами значения любых двух переменных независимо от их типа данных.
  • Строки 7-8: Мы создаем две переменные и присваиваем им целочисленные значения.
  • Строки 9-11: Мы печатаем значения строковых переменных перед заменой. Затем мы вызываем swapValues функцию и снова печатаем значения.
  • Строки 13-14: Мы создаем две переменные и присваиваем им строковые значения.
  • Строки 15-17: Мы печатаем значения переменных перед заменой. Затем мы вызываем swapValues функцию и снова печатаем значения.

 

Вопрос 10. Что такое заявление guard в Swift?

Заявление guard улучшает читаемость и ремонтопригодность, позволяя досрочно завершить работу, если условие не выполнено. Досрочный выход может быть из функционального или кодового блока. Обычно используется для обработки предварительных условий в начале функции, избегая вложенных if инструкций и улучшая ясность кода. Его синтаксис guard condition else {}. Если условие инструкции guard принимает значение true, то выполнение кода продолжается в обычном режиме. Однако, если оно принимает значение false, выполняется код после ключевого слова else. Следует отметить, что else блок должен содержать код, который выводит управление программой за пределы области, такой как return, throw, break или continue.

Пример использования заявления guard:

func test(_ name: String?) {
    guard let name = name else {
        print("guard condition is not true. Entered the else code.")
        return
    }
    print("guard condition was true.")
}
test("AndreyEx")
test(nil)

 

Объяснение кода:

  • Строки 1-7: Мы определили функцию test для проверки выполнения guard условия. Затем мы определили защитное условие, согласно которому, если name равно нулю, оператор guard печатает сообщение и досрочно завершает работу функции с помощью return . Но если name имеет значение, выполнение продолжается.
  • Строка 9: Мы вызываем метод test со String значением, поэтому печатается сообщение в строке 6.
  • Строка 10: Мы вызываем метод test с нулевым значением, поэтому защитное условие становится ложным, и печатается сообщение в строке 3.

 

На этом мы завершаем наш блог о 10 лучших вопросах для интервью Swift. Мы начали с постановки вопроса и подробного объяснения ответа. Затем мы привели пример на основе кода для лучшего понимания. Следует отметить, что многие другие концепции Swift будут рассмотрены в следующей серии этого блога.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:


0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Это может быть вам интересно


Рекомендуемое
В мире глубокого обучения PyTorch стал одним из самых популярных…

Спасибо!

Теперь редакторы в курсе.