Структура и класс в iOS. Схожесть и различия

Структуры и классы очень схожи по синтаксису и возможностям.

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

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

Уникальные возможности классов:

1. наследование

2. приведение типов (type casting)

3. деинициализатор

Классы — ссылочного типа (reference type), а структуры — значимого типа (value type) Структуры всегда копируются, когда они передаются в коде, и при этом не используют подсчета ссылок.

Пример синтаксиса:


struct Point {

var x = 0

var y = 0

}

 

 

class Pixel {

var point = Point()

var rColor = 255

var gColor = 255

var bColor = 255

var name: String? }


 

Создаем экземпляр var pixel = Pixel()

У структур есть возможность создавать экземпляр указывая значение для всех свойств var point = Point(x: 3, y:10) Доступ к свойствам через точку. var x = pixel.point.x

Структуры — значимого типа, следовательно если присвоить в другую переменную экземпляр структуры — он будет скопирован, и его значения можно будет менять независимо. В случае же не структуры, а класса, если обе переменные будут ссылаться на один и тот же объект, и изменить внутреннее состояние одной из них — у второй оно также будет изменено на новое. Более того, в этом случае выражение obj1 === obj2 равно true. Т.к. оператор === это оператор не равенства ==, а идентичности, обе переменные ссылаются на один и тот же объект.

 

Протоколы и делегаты. Описание и назначение.

Протокол может быть принят классом, структурой или перечислением для обеспечения фактической реализации этих требований. Протокол - это список методов, которые определяют "контракт" или "интерфейс". Пример:

protocol Speaker {
func Speak()
}

Этот протокол объявляет единственный метод Speak. Любой класс, который соответствует этому протоколу, должен имплементировать этот метод. Пример:

class Vicki: Speaker {
func Speak() {
println("Hello, I am Vicki!")
}
}

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

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

@objc protocol Speaker {
func Speak()
optional func TellJoke()
}

Пример вызова: var speaker:Speaker speaker = Vicki() speaker.Speak()

Делегаты

Делегат - переменная, которая подчиняется протоколу, который в свою очередь используется классом, для оповещения событий или выполнения различных подзадач.

protocol DiceGame { var dice: Dice { get } func play() }
protocol DiceGameDelegate {
func gameDidStart(_ game: DiceGame)
func game(_ game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int)
func gameDidEnd(_ game: DiceGame) }

DiceGameDelegate предоставляет три метода для отслеживания прогресса игры. Эти три метода были включены в логику игры и вызываются когда начинается новая игра, начинается новый ход или игра кончается.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: