- •Объявление, инициализация и изменение значения. Виды операторов. Переменные и константы. Виды объектов.
- •Типы данных
- •4. Числовые типы данных. Арифметические операторы. Приведение числовых типов данных.
- •5. Текстовые типы данных. Инициализация строковых значений. Приведение к строковому типу данных. Объединение строк.
- •6. Логические значения. Логические операторы.
- •Как проверить, есть ли значение в переменной с опциональным типом данных?
- •12* Операторветвления switch. Fallthrough. Where.
- •13.Сұрақ. Кортежи в операторе switch
- •Наборы: объявление набора, создание пустого набора, доступ к набору и модификация набора.
- •Оператор while
- •Оператор repeatwhile
- •24 Функции: объявление, синтаксис вызова функции. Примеры.
- •Заметка
- •25.Входные аргументы и возвращаемое значение
- •Глава 15 • Функции 245
- •26 Функция в качестве входного аргумента
- •27.Кортеж в качестве возвращаемого значения
- •28. Функционалдымүмкіндіктер. Функционалдытүрі. Функция аргумент ретінде.
- •29. Күрделіфункционалды тип. Қайтарумәніретінде функция
- •30. Кірістірілгенфункциялар. Функциянышамадантысжүктеу.
- •31. Рекурсивный вызов функций. Безымянные функции.
- •32.Замыкания. Функция как замыкания
- •33. Замыкание.Замыкающие выражение
- •Неявные возвраты из замыканий с одним выражением
- •Сокращенные имена аргументов
- •Создание нового отсортированного массива#
- •Сортировка существующего массива на месте#
- •Сортировка массива с пользовательским заказом#
- •38.Объектно-ориентированное программирование в Swift. Экземпляры
- •43. Собственны еинициализаторы
- •44. Методы в структурах
- •45.Сыныптар құрылымдарға өте ұқсас, бірақ олар бірнеше маңызды нүктелермен ерекшеленеді.
- •Переопределение свойств
- •52.Псевдоним Any.Приведение типа Any.Псевдоним AnyObject
- •53.Инициализаторы
- •54.Деинициализаторы
- •Создание Auto Layout и его составляющих
- •. Понятие Segues. Виды Segues.
- •59. Создание программируемых переходов. (ProgrammaticSeguesiniOs)
- •60 .Передачаданныхмеждуконтроллерами. (Passing Data Between Controllers)
- •Отображение данных в мобильном приложении ввиде списка. Работа с таблицами в iOs (Working With Tables)
- •Понятие делегата и протокола на примере работы с таблицами. Назначение и принцип работы. (Table delegates and protocols)
- •Опциональные протоколы
- •Использование протоколов
- •Делегаты
- •Создание и отображение данных в ячейках (Creating custom table cell)
- •Принципы работы с Core Data (Working With Core Data, Saving to Core Data, Fetching data from Core Data, Deleting items from Core Data)
- •Понятие и назначение rest & crud (Understanding rest & crud)
- •67.Асинхронды
- •68. Создание post запросов (Making post requests)
- •Размеры и другие детали внешнего исполнения[править | править код]
Опциональные протоколы
Вы можете обозначить метод в протоколе как опциональный. Чтобы попробовать, замените протокол Speaker следующим кодом:
@objc protocol Speaker {
func Speak()
optional func TellJoke()
}
Если у вас произошла ошибка, то добавьте следующую строку на самый верх вашей площадки:
import Foundation
Если вы хотите создать протокол с опциональными методами, то вам нужно создать его с префиксом @objc (даже, если ваш класс никак не связан с Objective-C). После этого вы можете ставить префикс optional у любого метода, который должен быть опциональным.
Обратите внимание, что сейчас нет ошибки компилятора, для вашего класса Person или класса Dog.
В этом примере, Ray и Vicki расскажут шутку. Так что имлементируем этот метод только для двух классов:
class Vicki: Speaker {
func Speak() {
println("Hello, I am Vicki!")
}
func TellJoke() {
println("Q: What did Sushi A say to Sushi B?")
}
}
class Ray: Speaker {
func Speak() {
println("Yo, I am Ray!")
}
func TellJoke() {
println("Q: Whats the object-oriented way to become wealthy?")
}
func WriteTutorial() {
println("I'm on it!")
}
}
Обратите внимание, что когда вы имплементируете протокол, то при необходимости, ваш класс может иметь больше одного метода, а не только тот, что указан в протоколе. Здесь класс Ray имеет один дополнительный метод.
Кстати, а вы не догадались случайно до ответов на эти шуточные вопросы?
Q: What did Sushi A say to Sushi B? A: Wasabi!
Q: Whats the object-oriented way to become wealthy? A: Inheritence!
Использование протоколов
На данный момент, вы уже создали протокол и несколько классов, которые их используют, давайте теперь попробуем использовать их. Добавьте следующий код на площадку:
var speaker:Speaker
speaker = Ray()
speaker.Speak()
// speaker.WriteTutorial() // error!
(speaker as Ray).WriteTutorial()
speaker = Vicki()
speaker.Speak()
Смотрите, вместо того, чтобы объявлять speaker как Ray, вы объявляете его как Speaker. Это значит, вы можете только вызывать методы для speaker, который существует в протоколе Speaker, так что вызов WriteTutorial вызовет ошибку, даже не смотря на то, что speaker - это тип Ray. Вы можете вызвать WriteTutorial, если вы временно отправите speaker обратно к Ray, как вы можете наблюдать тут.
Также обратите внимание, что вы можете присвоить speaker Vicki, так как Vicki, так же подчиняется Speaker.
Теперь, добавьте эти строки для эксперимента с опциональным методом:
speaker.TellJoke?()
speaker = Dog()
speaker.TellJoke?()
Помните, что метод TellJoke - опциональный метод, и перед тем как его вызвать, нужно проверить его существование.
Эти строки используют технику последовательности опционала. Если вы поставите вопросительный знак ? после имени метода, то прежде чем вызвать метод, будет проводиться проверка на его существование. Если он не существует, то он будет вести себя так, как метод возвращающий nil.
Последовательность опционала - полезная техника, когда вы хотите проверить существование значения перед тем, как его использовать. Является альтернативой опциональной связке (if let). Именно эту технику мы и будем использовать до конца данного туториала и во всех остальных.