Материал: iOS сессия ответы

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

43. Собственны еинициализаторы

Инициализатор әдіс болғанына қарамастан, ол func кілт сөзін қолданбай жарияланады. Бұл жағдайда бір құрылым әрқайсысы инициализаторлардың еркін санын қамтуы тиіс кіріс параметрлерінің ерекше жиынтығы болуы керек. Инициализатор ішіндегі дананың қасиеттеріне қол жеткізу self операторының көмегімен. Тек Name қасиеті үшін мән алатын Chess ішіндегі Player құрылымы үшін инициализатор құрайық.

struct PlayerInChess {

var name: String = "Игрок"

var wins: UInt = 0

//инициализатор

init(name: String){

self.name = name

}

}

var helga = PlayerInChess(name: "Ольга")

helga.wins // 0

// следующий код должен был бы вызвать ошибку

// var newPlayer = PlayerInChess()

Инициализатор мәнді тек name қасиеті үшін алады, бұл wins қасиеті әдепкі бойынша іске қосылады. Дананы жасау кезінде сізге тек қол жетімді болады сіз жасаған инициализатор.

Құрылымның назары-түрлері-мағыналары. Құрылымның данасын бір параметрден екінші параметрге беру кезінде оның көшірмесі жасалады. Келесі мысалда бір құрылымның екі тәуелсіз данасы жасалады:

var olegMuhin = PlayerInChess(name: "Олег")

var olegLapin = olegMuhin

44. Методы в структурах

Әдістерді жариялау

Басқа қасиеттерін, құрылымын және аудару, қамтуы мүмкін әдістері. Құрылымдардағы әдіс декларациясының синтаксисі ұқсас есептеулерде әдістерді жариялау. Олар әдеттегі функциялар сияқты, кіріс параметрлерін қабылдай алады. Өзіңіздің қол жеткізу үшін құрылымның қасиеттеріне self операторы қолданылады. Біз консольде шахмат ойыншысы туралы анықтамалық ақпаратты көрсететін сипаттама () әдісін жүзеге асырамыз

struct PlayerInChess {

var name: String = "Игрок"

var wins: UInt = 0

init(name: String){

self.name = name

}

func description(){

print("Игрок \(self.name) имеет \(self.wins) побед")

}

}

var andrey = PlayerInChess(name: "Андрей")

andrey.description()

Консоль

Игрок Андрей имеет 0 побед

Өзгерту әдістері

Әдепкі бойынша, инициализаторлардан басқа құрылымдық әдістер сол құрылымдарда жарияланған қасиеттер мәндерін өзгерте алмайды. Үшін осы шектеуді айналып өту үшін, жарияланатын аттың алдында mutating модификаторын көрсету қажет. Wins сипатының мәнін өзгертетін wins әдісін жасаймыз

struct PlayerInChess {

var name: String = "Игрок"

var wins: UInt = 0

init(name: String){

self.name = name

}

func description(){

print("Игрок \(self.name) имеет \(self.wins) побед")

}

mutating func win( count: UInt = 1 ){

self.wins += count

}

}

var harold = PlayerInChess(name: "Гарольд")

harold.wins // 0

harold.win()

harold.wins // 1

harold.win( count: 3 )

harold.wins // 4

45.Сыныптар құрылымдарға өте ұқсас, бірақ олар бірнеше маңызды нүктелермен ерекшеленеді.

Түрі. Класс-сілтеме түрі. Сынып даналары көшіру емес, сілтеме.

Өзгергіштік. Сынып данасы оның мәндерін өзгерте алады айнымалы (var) деп жарияланған қасиеттер, егер берілген данасы тұрақты (let) сақталса да. Бұл жағдайда кілтсөзді пайдаланыңыз

mutating сөзі әдістер үшін қажет емес. Мұрагерлік. Екі сынып "суперклассқа" қатысты болуы мүмкін– субкласс " бір-біріне. Бірақ назар аударыңыз: субкласс мұра етеді және суперкласстың барлық сипаттамаларын (қасиеттері мен әдістерін) қамтиды және оны одан әрі кеңейтуге болады. Шектеулер туралы, 27-тарауда айтылған мұрагерлікке байланысты.

Инициализаторлар. Сыныпта тек init () {} инициализаторы бар, ол кіріс мәнін беруді қажет етпейді

оларды қасиеттерге орнатуға арналған параметрлер. Деинициализаторлар. Swift жойғышты жасауға мүмкіндік береді-жойылған кезде автоматты түрде шақырылатын арнайы әдіс сынып данасы. Түрлерін келтіру. Бағдарламаны орындау барысында сіз сынып данасының белгілі бір типке сәйкестігін тексеру деректер.

СИНТАКСИС

сынып Атауы {

// сынып қасиеттері мен әдістері

}

* Сыныптар class кілт сөзімен жарияланады, содан кейін аты шығады

құрылған сынып. Сыныптың аты жоғарғы түйеде жазылуы керек

Регистр.

* Сынып денесі бұйра жақшалардан тұрады және әдістер мен қасиеттерді, сондай-ақ біз әлі таныс емес басқа элементтерді қамтуы мүмкін.

Сынып қасиеттері

Сабақтарды қолдану мысалын қарастырыңыз.

"Шахмат фигурасы"мәнін модельдеу қажет. Бұл ретте

ол келесі қасиеттер жиынтығына ие болуы керек:

пішіннің түрі;

пішіннің түсі;

ойын алаңындағы координаттар.

Тағы бір қосымша қасиетте біз шахмат фигурасына сәйкес келетін таңбаны сақтаймыз (Юникодқа қажетті заттар кіреді

рәміздер).

Координаттар тек анықтау үшін ғана емес

шахмат тақтасындағы фигураның орналасқан жері, сонымен қатар анықтау үшін

оның болу фактісі. Егер фигура өлтірілсе немесе әлі ашылмаса, онда

координаттардың мәні nil болады.

Сыныптың қасиеттері анықталғандықтан, оны дамыту қажет

олардың мәндерін белгілейтін инициализатор.

class Chessman {

// тип фигуры

let type: String

// цвет фигуры

let color: String

//координаты фигуры

var coordinates: (String, Int)? = nil

// символ, соответствующий фигуре

let figureSymbol: Character

// инициализатор

init(type: String, color: String, figure: Character){

self.type = type

self.color = color

self.figureSymbol = figure

}

}

// создаем экземпляр фигуры

var kingWhite = Chessman(type: "king", color: "white", figure:

"\u{2654}")

46.Методы классов. Инициализаторы классов. Вложенные типы.

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

class Counter {

var count = 0

funcincrement() {

count += 1

}

funcincrement(by amount: Int) {

count += amount

}

funcreset() {

count = 0

}

}

Класс Counter() определяет три метода экземпляра:

  • increment увеличивает значение счетчика на 1

  • increment(by: Int) увеличивает значение счетчика на определенное значение amount.

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

init() {

// инициализация проводится тут

}

Зачастую перечисления создаются для дополнительной поддержки функциональности определенного класса. Аналогично может быть полезным создание вспомогательных классов или структур, предназначенных для контекста более сложного типа. Для достижения этой цели Swift предлагает вам определить вложенные типы, в которые вы вкладываете вспомогательные перечисления, классы и структуры, внутри определения типа, которые они поддерживают. Для того, чтобы использовать вложенные типы снаружи определяющего их контекста, нужно поставить префикс имени типа, внутри которого он вложен, затем его имя:

let heartsSymbol = BlackjackCard.Suit.hearts.rawValue

// heartsSymbol равен "♡"

47.Свойства. Типы свойств: Хранимые, ленивые, Вычисляемые.

Свойства связывают значения с определённым классом, структурой или перечислением.

Свойства предназначены для хранения состояния объекта. Свойства бывают двух типов:

  • Хранимые свойства (storedproperties) - переменные или константы, определенные на уровне класса или структуры

  • Вычисляемые свойства (computedproperties) - конструкции, динамически вычисляющие значения. Могут применяться в классе, перечислении или структуре

Хранимые свойства представляют простейшую форму хранения значений в виде констант или переменных:

class User {

    var age: Int = 22

    letname: String = ""

}

Ленивые хранимые свойства (lazystoredproperties) представляют такие свойства, значение которых устанавливается при первом обращении к ним. Использование подобных свойств позволяет более эффективно использовать память, не загромождая ее ненужными объектами, которые могут не потребоваться.

Ленивые свойства определяются с помощью ключевого слова lazy:

class User {

     

    lazy var age: Int = 22

    lazy var name: String = "Tom"

}

Вычисляемые свойства (computedproperties) не хранят значения, а динамически вычисляют его, используя блок get (getter). Также они могут содержать вспомогательные блок set (setter), который может применяться для установки значения.

Общий синтаксис определения вычисляемого свойства следующий:

varимя_свойства: тип {

    get {

        //вычисление значения

    }

    set (параметр) {

        // установка значения

    }

}

48.Контроль получения и установки значений: геттер и сеттер вычисляемого свойства

Вычисляемые свойства (computedproperties) не хранят значения, а динамически вычисляют его, используя блок get (getter). Также они могут содержать вспомогательные блок set (setter), который может применяться для установки значения.

Общий синтаксис определения вычисляемого свойства следующий:

varимя_свойства: тип {

    get {

        //вычисление значения

    }

    set (параметр) {

        // установка значения

    }

}

Блок get или геттер срабатывает при получении значения свойства. Для возвращения значения должен использоваться оператор return.

Блок set или сеттер срабатывает при установке нового значения. При этом в качестве параметра в блок передается устанавливаемое значение.

49.Наследование. Доступ к наследуемым характеристикам

Класс может наследовать методы, свойства и другие характеристики другого класса. Когда один класс наследует у другого класса, то наследующий класс называется подклассом, класс у которого наследуют - суперклассом. Наследование - фундаментальное поведение, которое отделяет классы от других типов Swift.

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

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

Одной из главных целей объектно-ориентированного подхода является многократное использование кода. Объединять код для его многократного использования позволяют замыкания (включая функции) и объектные типы данных. В методологии ООП, помимо создания экземпляров различных перечислений, структур и классов, существует возможность создания нового класса на основе существующего с автоматическим включением в него всех свойств, методов и сабскриптов класса-родителя. Данный подход называется наследованием. В рамках наследования «старый» класс называется суперклассом (или базовым классом), а «новый» — пНаследование является актом создания нового класса на базе существующего класса (базового класса). Подкласс наследует характеристики от существующего класса, который затем может быть усовершенствован. Вы так же можете добавить новые характеристики подклассу.одклассом (или субклассом, или производным классом).

Доступ к наследуемым элементам родительского класса в производном классе реализуется так же, как к собственным элементам данного производного класса, то есть с использованием ключевого слова self. В качестве примера в класс Dog добавим метод, выводящий на консоль кличку собаки. Кличка хранится в свойстве name, которое наследуется от класса Quadruped.

50.Переопределение наследуемых элементов. Доступ к переопределенным элементам суперкласса.

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

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

Ключевое слово override так же подсказывает компилятору Swift проверить, что вы переопределяете суперкласс класса (или один из его параметров), который содержит то определение, которое вы хотите переопределить. Эта проверка гарантирует, что ваше переопределение корректно.

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

Там, где это уместно, вы можете получить доступ к методу, свойству, индексу версии суперкласса, если будете использовать префикс super:

  • Переопределенный метод someMethod может вызвать версию суперкласса метода someMethod, написав super.someMethod() внутри переопределения реализации метода.

  • Переопределённое свойство someProperty может получить доступ к свойству версии суперкласса someProperty как super.someProperty внутри переопределения реализации геттера или сеттера.

  • Переопределенный индекс для someIndex может получить доступ к версии суперкласса того же индекса как super[someIndex] изнутри переопределения реализации индекса.

Переопределение свойств

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

ли альтернативную версию реализации метода в подклассе.

Доступ к наследуемым характеристикам

Доступ к наследуемым элементам родительского класса в произ­водном классе реализуется так же, как к собственным элементам данного производного класса, то есть с использованием ключевого слова self. В качестве примера в класс Dog добавим метод, выводящий на консоль кличку собаки. Кличка хранится в свойстве name, которое наследуется от класса Quadruped.

51.Переопределение инициализаторов. Переопределение наследуемых свойств

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

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

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

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

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

Ключевое слово override также побуждает компилятор Swift проверить, что у суперкласса вашего замещающего класса (или одного из его родителей) есть объявление, соответствующее тому, которое вы указали для замены. Эта проверка гарантирует, что ваше определение переопределения верное.

Доступ к методам, свойствам и индексам суперкласса

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

Когда это уместно, вы получаете доступ к версии суперкласса метода, свойства или индекса с помощью префикса super:

Переопределенный метод с именем someMethod () может вызывать версию суперкласса someMethod (), вызывая super.someMethod () в реализации метода переопределения.

Переопределенное свойство с именем someProperty может получить доступ к версии суперкласса someProperty как super.someProperty в рамках реализации переопределения метода получения или установки.

Переопределенный индекс для someIndex может получить доступ к версии суперкласса того же индекса, что и super [someIndex], из реализации замещающего индекса.