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

Опциональные протоколы

Вы можете обозначить метод в протоколе как опциональный. Чтобы попробовать, замените протокол 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). Именно эту технику мы и будем использовать до конца данного туториала и во всех остальных.

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