Вы находитесь на странице: 1из 11

СТРУКТУРА

Структура
• struct
• Value type – при присвоении значения копируется, а не передается ссылка на объект
• Многие встроенные типы являются структурой (String, Int, Dictionary, Array и пр.) – можно посмотреть в XCode
• Проще и быстрее, чем обычные классы

• Применяется, когда нужно объединить в тип простые данные

• В Java такого типа не существует, только классы



Заметки
• Свойства, характеристики объекта – могут хранить как обычные значения, так и ссылки на другие объекты

• Properties:
• Stored properties
• Хранят конкретное значение
• var или let
• необязательные свойства можно указать как Optional (могут принимать nil)

• Computed properties
• Не хранят конкретное значение, а вычисляют его
• Могут использовать другие свойства для вычисления
• Небольшие вычисления (иначе лучше использовать метод)
• Реализуется с помощью конструкций get-set
• только var
static
• В Swift называют «type property» – статичный элемент

• Не привязан к экземплярам, одно значение на всех

• Аналогично static в Java


Заметки
• Если присвоить структуру в константу (let) – нельзя изменять свойства объекта, даже если они объявлены как var – т.к.
struct это value type (Для классов – можно, т.к. они reference type)

• Переменная может быть либо read-only либо read-write

• Переменная не может быть write-only

• self – аналог this, ссылка на текущий экземпляр (рекомендуется всегда использовать self, связано с поведением
замыканий внутри класса, когда замыкание захватывает переменную)
get-set
• Геттеры – сеттеры – это computed property, поэтому только вычисляют значения на основе других переменных, а не хранят как
stored property (в отличие от Java, где get-set это просто доступ к переменным объекта)

• set отличается от Java – больше используется, чтобы вычислить значение из других переменных

• Внутри get-set блоков – хранят старое и переданное значение

• Если get и set не выполняют вычислений – лучше их не создавать (использовать просто stored property)

• set может отсутствовать (тогда свойство будет read-only)

• если нет set - слово get можно не добавлять

• внутри set можно использовать константу newValue

• свойства с get-set не могут присваивать значение по-умолчанию при объявлении

• Не вызывайте self присвоение для той же переменной внутри set (будет зацикливание):
• self.budget = newValue для сеттера budget
Property observers
• Observers (наблюдатели)
• «Слушают» изменение значений для stored property (для computed property есть get-set)
• Может «отловить» момент до или после изменения значения
• Переменная с наблюдателями может присваивать значение по-умолчанию при объявлении (computed property не может)
• Нельзя использовать одновременно с computed property (get/set)
• Можно использовать константы oldValue и newValue (либо задавать свои имена этих констант, если не хотите использовать имена
по-умолчанию)

• Отрабатывают:
• Когда меняем значение уже после создания объекта (не во время инициализации)
• Если передали свойство в метод в качестве параметра inout
lazy
• Инициализация свойства по требованию (при первом обращении)

• Работает только с var


Свойства
• Возможные варианты:

• Stored property

• Stored property + observers

• Computed properties
Когда и что использовать
• Если переменная read-write – используйте просто • Если переменная вычисляет свое значение на основе
объявление переменной других переменных – используйте get/set
var name: String var name: String{
get{
return ““
• Если переменная read-only – реализуйте только get }
var name: String{ set{
return ““ // здесь нельзя присваивать значение в эту же
} // переменную self.name – зациклится, но можно
// использовать super.name (если name есть у родит.
// класса)
}
}
Домашнее задание

• Реализовать Hometask

• Прочитать:
• https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html

• https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStruc
tures.html