Apple представила язык программирования Swift в 2014 году как современный, безопасный и быстрый язык, предназначенный для простого изучения и использования. Он сочетает в себе элементы из различных языков программирования, таких как Objective-C, C, Python и других, при этом представляя новые функции.
Хотя он в основном используется для разработки на iOS и macOS, он также набирает популярность для кроссплатформенной разработки.
Существует высокий спрос на квалифицированных разработчиков Swift, поэтому изучение it откроет возможности для карьерного роста в сфере разработки приложений для iOS, одном из самых быстрорастущих секторов технологической индустрии. В этом блоге будут обсуждаться 10 наиболее часто задаваемых вопросов для интервью Swift.
В Swift ключевые слова let и var используются для объявления констант и переменных соответственно.
Мы объявляем константу с помощью 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)
Примечание: Попробуйте раскомментировать код в строках 6-7 и выполните код. Мы получим ошибку компиляции, заключающуюся в том, что мы не можем присвоить значение константе.
Мы объявляем переменную с помощью 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)
Вывод типа — это функция, которая позволяет компилятору автоматически определять тип данных переменной или константы на основе присвоенного ей начального значения. Это делает код более чистым и лаконичным без ущерба для безопасности типов. Это особенно полезно при работе со сложными типами данных, такими как массивы или словари, где явное указание типов может быть громоздким.
Пример использования вывода типов:
let number1 =100 let number2 =200.356 var message ="Educative" print(type(of: number1)) print(type(of: number2)) print(type(of: message))
Когда мы выполняем код, мы видим типы данных, напечатанные как Int, Double и String.
Кортеж — это облегченная структура данных, которая может группировать несколько значений в одно составное значение. Она может содержать любую комбинацию значений разных типов. Они обычно используются в Swift для функций, которым необходимо возвращать несколько значений, или при работе с API, которые возвращают несколько значений. Они предоставляют удобный способ группировать связанные значения без определения пользовательской структуры данных, такой как класс или struct.
Пример использования кортежа:
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);
В 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") }
Оператор === проверяет, относятся ли две переменные или константы к одному и тому же экземпляру памяти. Его также называют оператором идентификации. В основном используется для классов и функций, чтобы проверить, указывают ли две ссылки на один и тот же экземпляр.
Пример использования оператора === :
class Student { } let student1 = Student() let student2 = student1 if student1 === student2 { print("They are the same objects.") }
for-in Цикл используется для перебора последовательности или коллекций, таких как массивы, наборы, словари и т.д. Мы можем выполнить набор инструкций для каждого элемента в последовательности. Его также можно использовать для доступа к индексу и значению каждого элемента в массиве с помощью enumerated() метода.
Пример использования цикла 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//////////////////////////// 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)
Протокол — это соглашение о методах, свойствах и других требованиях, которые соответствуют определенной функциональности. Классы, структуры и перечисления могут соответствовать протоколу, обеспечивающему реальную реализацию этих требований. Мы можем рассматривать их как интерфейсы в других языках программирования. Использование протоколов повышает гибкость кода и возможность повторного использования.
Пример использования протокола:
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()
Двойной вопросительный знак ?? в Swift называется оператором объединения нулевых значений. Он обеспечивает точный способ задать значение по умолчанию для необязательного параметра if nil. Предположим, у нас есть выражение x ?? y. Затем выражение принимает значение, равное x если x не равно нулю, и выражение принимает значение, равное y если x равно нулю.
Пример использования оператора ??:
let x: Int? = nil let y = 100 let result = x ?? y print(result)
Дженерики позволяют нам писать гибкие и повторно используемые функции, структуры, классы и перечисления, которые могут работать с любым типом. Мы можем написать код, который позволит избежать дублирования, абстрагируясь от типов и логики конкретных реализаций, таких как шаблоны в других языках программирования.
Примеры использования дженериков в 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)")
Заявление 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)
На этом мы завершаем наш блог о 10 лучших вопросах для интервью Swift. Мы начали с постановки вопроса и подробного объяснения ответа. Затем мы привели пример на основе кода для лучшего понимания. Следует отметить, что многие другие концепции Swift будут рассмотрены в следующей серии этого блога.