Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СЕССИЯ ОТВЕТЫ / iOS сессия ответы.docx
Скачиваний:
21
Добавлен:
25.12.2020
Размер:
14.45 Mб
Скачать

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] изнутри переопределения реализации индекса.

Соседние файлы в папке СЕССИЯ ОТВЕТЫ