Set_4 Flashcards
Что такое опционал и какие проблемы он призван решать?
Опционал считается мощным инструментом языка Свифт. Если после объявления типа поставить вопросительный знак, это будет указывать на то, что значение либо есть, либо его нет, а String и String? – это два разных типа. Например, в Objective-C отсутствие значения доступно только в ссылочных типах, и используется специальное значение nil.
Swift с его опционалами расширяет концепцию отсутствия значения как для ссылочных, так и для других типов. Данная переменная может содержать или какое-то значение, или nil. Чтобы узнать, что «внутри», достаточно развернуть опционал.
Когда вы должны использовать структуру, а когда – класс?
В Swift классы и структуры отличаются рядом особенностей. Выведем обобщенную разницу следующим образом:
Классы поддерживают наследование, структуры – нет.
Классы являются ссылочными типами, структуры – это типы значений.
Нет универсального правила, которое определяет, что лучше. Общая рекомендация – использовать оптимальный для достижения конкретной цели инструмент. Но лучше отдать предпочтение структурам, если не требуется наследование или ссылочная семантика.
Что такое дженерики и какие проблемы они решают?
Дженерики используются, чтобы алгоритмы безопасно работали с типами. В Swift дженерики могут юзаться как в функциях, так и в типах данных: например, в классах, структурах, etc.
Дженерики решают проблему дублирования кода. Обычный случай – это когда у вас есть метод, который принимает тип параметра, и вам нужно его продублировать для размещения параметра другого типа.
Например, в следующем коде вторая функция является «клоном» первой: она просто принимает строки вместо целых чисел:
Объясните суть неявно развернутых (извлеченных) опционалов.
Неявно извлеченные опционалы обозначаются восклицательным знаком и не имеют значения до первого обращения. После обращения опционал обязательно должен принять объявленное значение. Далее он может использоваться как простой не опциональный тип, взаимодействовать с другими значениями аналогичных типов и не проверяться на nil.
Не применяйте неявно развернутые опционалы, если они не нужны. Неправильное использование увеличивает вероятность сбоев во время выполнения.
Чтобы объявить статическое свойство или функцию, используйте модификатор static. На примере структуры:
struct Sun {
static func illuminate() {}
}
Для классов можно использовать либо static, либо модификатор class. Они достигают одной и той же цели, но на самом деле разные. Можете ли вы объяснить, чем они отличаются?
static делает свойство или функцию статической и не переопределяемой. Используя класс, вы можете переопределить свойство или функцию.
При применении к классам static становится псевдонимом для class final.