Pull to refresh
747.25
OTUS
Цифровые навыки от ведущих экспертов

Интервью — 10 вопросов про Swift. Часть 2

Reading time5 min
Views13K
Original author: Animesh Mishra
До запуска курса «iOS-разработчик» остается все меньше времени, поэтому сегодня мы продолжаем публиковать материал из серии «10 вопросов про Swift». Первую часть которого можно прочитать тут.



Объясните дженерики в Swift?


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

Типы Array и Dictionary в Swift являются универсальными коллекциями (дженериками).
В приведенном ниже коде универсальная функция для свапа двух значений используется для строки и целого числа. Это пример кода многократного использования.

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
 let temporaryA = a
 a = b
 b = temporaryA
}
var num1 = 4
var num2 = 5
var str1 = “a”
var str2 = “b”
swapTwoValues(&num1,&num2)
swapTwoValues(&str1,&str2)
print (“num1:”, num1) //output: 5
print (“num2:”, num2) //output: 4
print (“str1:”, str1) //output: b
print (“str2:”, str2) //output: a

Что такое опциональные типы в swift и когда их следует использовать?


Опциональным (Optional, “опционал”) в Swift является тип, в котором значение может быть, а может и не быть. Опционалы обозначаются путем добавления «?» к любому типу.

Варианты использования опционала:

  1. Фрагменты кода, которые могут претерпеть неудачу (я чего-то ожидал, но ничего не получил).
  2. Объекты, которые в данный момент являются пустыми, но могут стать чем-то позже (и наоборот).

Хороший пример опционала:

Свойство, которое может присутствовать или отсутствовать, например отчество или муж/жена в классе Person.

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

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

Свойства-делегаты, которые не всегда должны быть установлены и обычно устанавливаются после инициализации.

Как слабые ссылки в классах. То, на что они указывают, может быть установлено в nil в любое время.

Если вам нужен способ узнать, когда установлено значение (данные еще не загружены> данные) вместо использования отдельного логической переменной dataLoaded.

Что такое опциональная последовательность (optional chaining) в Swift?


Процессы запроса, вызова свойств, сабскриптов и методов для опционала, который может иметь значение «nil», определяется как опциональная последовательность (опциональная цепочка).

Опциональная последовательность возвращает два значения —
  • если опционал содержит “значение”, то при вызове связанных с ним свойств, методов и сабскриптов возвращается значение
  • если опционал содержит “nil”, все связанные с ним свойства, методы и сабскрипты возвращают nil

Опциональная последовательность — это альтернатива принудительной распаковки.

Что такое принудительная распаковка (forced unwrapping)?


Принудительная распаковка — это способ извлечения значения, содержащегося в опционале. Эта операция опасна, потому что вы, по сути, говорите компилятору: я уверен, что этот опционал содержит реальное значение, извлеки его!

let value: Int? = 1
let newValue: Int = value! // Теперь newValue содержит 1 
let anotherOptionalInt: Int? = nil
let anotherInt = anotherOptionalInt! // Output:fatal error: внезапный nil при распаковке опционального значения.

Что такое неявная распаковка (implicit unwrapping)?


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

var name: String! = “Virat”
let student = name // В данный момент мы считываем текст
name = nil
let player = name //Output:fatal error: внезапный nil при распаковке опционального значения.

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

Что такое опциональный биндинг (Optional binding)?


Вы можете распаковывать опционалы как «безопасным», так и «небезопасным» способом. Безопасный способ — использовать опциональный биндинг.

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

let possibleString: String? = "Hello"
if let actualString = possibleString {
//actualString - обычное (не опциональное) строковое значение
//равное значению, хранимому в possibleString
   print(actualString)
}
else {
  //possibleString не содержат значения, обработайте эту
  //ситуацию
}

Что такое Guard и каковы его преимущества?


Оператор guard прост и могуч. Он проверяет некоторое условие и, если оно оценивается как ложное, выполняется оператор else, который обычно завершает работу метода.

func addStudent(student: [String: String]) {
guard let name = student["name"] else {
return
}
print("Added \(name)!")
guard let rollNo = student ["rollNo"] else {
print("roll No not assigned")
return
}
print("Assigned roll no is \(rollNo).")
}
addStudent(student: ["name": "Ravi"])
// Выведет "Added Ravi!"
// Выведет "roll No not assigned"
addStudent(student: ["name": "Ravi", "rollNo": "1"])
// Выведет "Added Ravi!"
// Выведет "Assigned roll no is 1"

Преимущество guard заключается в более быстром исполнении. Guard блок выполняется только в том случае, если условие ложно, и выход из блока будет осуществлен через оператор передачи управления, такой как return, break, continue или thrown. Это обеспечивает ранний выход и меньшее количество скобок. Ранний выход означает более быстрое выполнение.

Пожалуйста, обратитесь к этой статье за дополнительной информацией.

Когда следует использовать guard let, а когда if let?

  • Используйте guard, когда вы хотите устранить неожиданный/неправильный ввод и сосредоточится на цели, если у вас есть альтернативные способы обработки ввода.
  • Используйте guard if else блок чтобы уменьшить вложенность и отступы, так как он относительно компактен.

Что такое defer?


Оператор defer используют для выполнения набора операторов непосредственно перед тем, как выполнение кода покидает текущий блок.

Оператор defer внутри блока if будет выполняться первым. Затем следует шаблон LIFO для выполнения остальных defer операторов.

func doSomething() {
defer { print(“1”)}
defer { print(“2”)}
defer { print(“3”)}
if 1<2 {
defer { print("1<2")}
}
defer { print(“4”)}
defer { print(“5”)}
defer { print(“6”)}
}
Вывод 1<2 6 5 4 3 2 1

Перечислите, какие операторы передачи управления используются в Swift?


break — оператор break немедленно завершает выполнение всего оператора потока управления.

continue — оператор continue указывает циклу прекратить то, что он делает, и начать заново в начале следующей итерации цикла.
return — возвращает значения из функций.
throw — нужен проброса ошибок с использованием Throwing Functions
fallthrough — оператор fallthrough используется в блоке switch case для выполнения оператора case, который находится рядом с соответствующими операторами case на основе пользовательских требований.

В swift оператор fallthrough используется для выполнения следующего case, даже если он не совпадает с исходным.

let integerToDescribe = 5
var description = “The number \(integerToDescribe) is”
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
description += “ a prime number, and also”
fallthrough
case 10:
description += “ case 10.”
default:
description += “ an integer.”
}
print(description)// Вывод:The number 5 is a prime number, and also case 10.

Конец второй части. Первую часть можно прочитать тут.

Ждем ваши комментарии и напоминаем о том, что уже через несколько часов пройдет день открытых дверей, в рамках которого будет подробно рассказано о нашем курсе.
Tags:
Hubs:
+12
Comments0

Articles

Information

Website
otus.ru
Registered
Founded
Employees
101–200 employees
Location
Россия
Representative
OTUS