Основы Swift / 11.1. Основы


Видео


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

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

Экземпляр класса традиционно называется объектом. Однако в Swift классы и структуры более близки по функциональности чем в других языках, и большая часть этой главы описывает функциональность, которая может быть применена к экземплярам и класса, и структуры. Ввиду этого оба термина - экземпляр и объект - можно считать равнозначными.
Сравнение классов и структур
Классы и структуры в Swift имеют много вещей в общем. Оба могут:
  • Определять свойства для хранения значений
  • Определять методы для предоставления функциональности
  • Определить субскрипты для предоставления доступа к их значениям с использованием синтаксиса сабскриптов
  • Определить инициализаторы для установки их изначальных значений
  • Быть расширенными для увеличения их функциональности по сравнению с имплемпентацией по-умолчанию
  • Адаптировать протколы для предоставления стандартизированной функциональности определённого вида
Классы имеют дополнительные особенности по сравнению со структурами:
  • Наследование позволяет одному классу наследовать характеристики другого.
  • Типоприведение позволяет Вам провеять и интерпретировать тип объекта класса в процессе выполнения.
  • Деинициализаторы позволяют объекту класса высвобождать любые ресурсы, которые были им задействованы.
  • Подсчёт ссылок позволяет существовать более чем одной ссылке на экземпляр. Структуры всегда копируются, когда они передаются в Вашем коде, и не используют подсчёт ссылок.
Синтаксис определения
Классы и структуры имеют сходный синтаксис определения. Вы предваряете классы ключевым словом class и структуры ключевым словом struct. Оба имеют своё полное определение внутри пары фигурных скобок:
@{11\1}
class SomeClass {
    // здесь идёт определение класса
}

struct SomeStructure {
    // здесь идёт определение структуры
}
Именование типов, их свойств и методов
Когда Вы определяете новый класс или структуру, Вы фактически определяете полностью новый тип Swift. Давайте типам имена UpperCamelCase (такие как SomeClass или SomeStructure), чтобы совпасть с заглавными именами стандартных типов Swift (таких как String, Int, Bool). Обратно, давайте всегда свойствам и методам имена с маленькой буквы, чтобы отделить их от имён типов. Такие имена называются lowerCamelCase (такие как frameRate и incrementCount).

Ранее мы уже изучили функциональные типы, замыкания, перечисления.
@{11\2\1}
struct Resolution {
    var width = 0
    var height = 0
}
class VidoeMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}
Пример определяет новую структуру с названием Resolution для описания разрешения экрана в пикселях. Эта структура имеет два хранимых свойства с названиями width и height. Хранимые свойства - это константы или переменные, которые хранятся в качестве части класса или структуры. Эти два свойства выведены в тип Int путём задания им изначального значения 0.

Пример также определяет новый класс с названием VideoMode для описания конкретного режима видео для видеодисплея. Этот класс имеет четыре переменных хранимых свойства. Первое, resolution, инициализируется новым экземпляром структуры Resolution, что выводит тип свойства в Resolution. Для трёх других свойств экземпляры VideoMode будут инициализированы настройкой interlaced значения false (что означает "нечрезстрочное видео"), частотой кадров воспроизведения 0.0, и опциональным значением типа String с названием name. Свойство name автоматически получает значение по-умолчанию nil или "нет значения name", так как это опциональный тип.
Экземпляры структур и классов
Определение структуры Resolution и класса VideoMode только описывает, как они будут выглядеть. Сами по себе они не описывают никакого конкретного разрешения или режима экрана. Чтобы сделать это, Вам нужно создать экземпляр структуры или класса.

И структуры, и классы используют синтаксис иницииализаторов для новых экземпляров. Простейшая форма синтаксиса конструктора использует имя типа класса или структуры, завершаемое пустыми круглыми скобами, как например Resolution() или VideoMode(). Это создаёт новый экземпляр класса или структуры со всеми свойствами, установленными в их дефолтные значения.

Синтаксис для создания экземпляров очень схож и для структур, и для классов:
@{11\2\2}
let someResolution = Resolution()
let someVideoMode = VidoeMode()
Получение доступа к свойствам
Свойства и методы класса называются его членами.

Вы можете получить доступ к свойствам экземпляра с использованием точечного синтаксиса. В точечном синтаксисе Вы пишите имя свойства сразу после имени экземпляра, разделив их точкой (.) без пробелов
@{11.2\3}
print("Ширина у someResolution равна \(someResolution.width)")
// Выведет "Ширина у someResolution равна 0"
В этом примере, someResolution.width ссылается на свойство width/ объекта someResolution и возвращает значение по-умолчанию 0.
Цепочка подсвойств
Вы можете спуститься вниз по цепочке подсвойств, как например свойство width в свойстве resolution у VideoMode:
@{11.2\4}
print("Ширина у someVideoMode равна \(someVideoMode.resolution.width)")
// Выведет "Ширина у someVideoMode равна 0"
Изменение свойств
Вы также можете использовать точечный синтаксис для присвоения новое значения переменному свойству:
@{11.2\5}
someVideoMode.resolution.width = 1280
print("Ширина у someVideoMode теперь равна \(someVideoMode.resolution.width)")
// Выведет "Ширина у someVideoMode теперь равна 1280"