Протоколы в Swift

Протоколы чрезвычайно важны в Swift

A protocolразрешает объекты и обеспечивает конкретную реализацию любого объекта, который ему соответствует. Мы можем думать о протоколе как о наборе правил и рекомендаций, которым может соответствовать объект.

Примеры читайте дальше.

Фото Майка Мейерса на Unsplash

Сложность: Начинающий | Легко | Нормальный | Испытывающий

Предпосылки:

  • Уметь создать «Hello, World!» Приложение для iOS (руководство ЗДЕСЬ )
  • Использование расширений (руководство ЗДЕСЬ )
  • Некоторое знание объектно-ориентированного программирования, в частности переопределения (руководство ЗДЕСЬ )

class: объект, определенный в Swift с использованием семантики передачи по ссылке.

соответствует: соответствие - это если объект принимает протокол (или наследует его от другого класса) и содержит указанные функции

enum: тип, состоящий из набора именованных значений, называемых членами

extension: расширения добавляют новые функции к классу, структуре, перечислению или протоколу

наследование: механизм, в котором один класс приобретает свойство другого класса.

метод: группа операторов, которые вместе могут выполнять функцию

протокол: план методов, свойств и требований для соответствия функциональности

свойство: ассоциация значения с классом, структурой или перечислением.

struct: объект, определенный в Swift с использованием семантики передачи по значению

Происхождение протоколов

В естественном английском языке a protocolозначает, что две стороны соглашаются общаться. Простым примером этого является традиционное рукопожатие в Англии (альтернативой является поклон в Японии).

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

Протокол управления передачей

Значение protocolв Swift тесно связано с этим значением, хотя, как мы увидим, оно несколько отличается.

В этом примере мы создадим социализированного человека, представленного следующим образом struct:

struct Person {
    var name: String
}
let anne = Person(name: "Anne")

Протокол означает, что вы можете указать свойства и методы, которые что-то должно содержать, а затем рассматривать объект как протокол.

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

A protocolпринимается a class, structили enumдля определения требований объекта, так что обеспечивается конкретная реализация протокола.

Синтаксис

Простая реализация

Мы можем настроить объект, protocolкоторый просто требует любого объекта conforms, демонстрирующего синтаксис:

protocol GreetingProtocol {
    func sayHello()
}

Затем мы можем обновить нашего человека conformдо нашегоGreetingProtocol

struct Person: GreetingProtocol {
    func sayHello() {
         print ("Hello")
    }
    var name: String
}
let anne = Person(name: "Anne")

Добавление свойств

В приведенном выше протоколе указан объект, methodкоторый необходимо включить в объекты, относящиеся conformк GreetingProtocol. Мы также можем требовать , чтобы любое лицо, conformsк GreetingProtocolимеет имя по обновлению протокола к следующему:

protocol GreetingProtocol {
    func sayHello()
    var name: String { get set }
}

Игра с протоколами

Отношение к протоколам как к типу

Используемые примеры являются продолжением structнаписанного выше.

Мы можем создать arrayпротокол нашего типа

// an array of Person
let arr = [anne]
type(of: arr) // [Person]
// an array of GreetingProtocol
let arrProtocol: [GreetingProtocol] = [anne]
type(of: arrProtocol) // [GreetingProtocol]

Протокол может наследовать от другого протокола, который известен как protocol inheritance. Можно унаследовать от одного или нескольких protocolsи при этом добавить больше протоколов к конкретному class, structили enum.

Мы можем настроить три различных поведения футболиста (то есть достойного игрока, а не того, кто играет за Ливерпуль):

protocol Strikes {
    func finish() -> Bool
}
protocol Tackles {
    func slides() -> Bool
    func blocks() -> Bool
}
protocol Moves {
   func runs()
   func jogs()
   func walks()
}

protocol Player: Strikes, Tackles, Moves {}

Если нам нужен конкретный игрок, который соответствует игроку, Protocolэто не проблема. Пример? Вот:

class Teemu: Player {
    func finish() -> Bool {
         return true
    }
func slides() -> Bool {
         return true
    }
func blocks() -> Bool {
         return true
    }
func runs() {
         print ("runs")
    }
func jogs() {
         print ("jogs")
    }
func walks() {
         print ("walks")
   }
// give a name
   var name: String = "Pukki"
}

var striker = Teemu()

striker.walks()

Можно условно соответствовать a Protocolв Swift, добавив ограничения.

Эти ограничения очень похожи (пожалуйста, поймите; точно такие же), как общие предложения where, описанные ЗДЕСЬ , но расширяют а, Protocolа не а Class).

Если мы хотим расширить Teemuкласс выше (чтобы дать ему возможность сохранять), это выглядело бы примерно так:

extension Player {
    func save() -> Bool {
         return false
    }
}

striker.save()

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

Итак, если мы добавим functionк нашим движениям «SayHello»protocol

protocol Moves {
   func runs()
   func jogs()
   func walks()
   func sayHello(name: String = "Dave) // ERROR
}

Заключение…

protocolsне могут быть созданы сами по себе, и их можно рассматривать как описание (или прототип), а не как typeсебя. Вы можете кодировать, используя Protocol-Oriented ApproachSwift, поэтому его стоит изучить!

Хотите связаться? Попробуйте ссылку здесь:

https://twitter.com/stevenpcurtis

Suggested posts

Мои наиболее используемые ресурсы кодирования

Мои наиболее используемые ресурсы кодирования

На этой неделе я получил электронное письмо от участника ежедневного списка рассылки. Они хотели знать: какие ресурсы вы посещаете ежедневно, еженедельно и ежемесячно? Отличный вопрос! Я рад поделиться некоторыми мыслями о моем рабочем процессе и основных ресурсах, которые я использую.

Инструментарий гиперсовременного терминала

Инструментарий гиперсовременного терминала

Терминалы, оболочки и инструменты командной строки, устанавливающие стандарт в 2023 году. Все разработчики используют терминалы; для некоторых весь рабочий процесс — это терминал Этот пост знакомит с Hypermodern Terminal Toolbox — терминалом, оболочкой и инструментами командной строки, устанавливающими стандарт в 2023 году Kitty как эмулятор терминала Kitty — это эмулятор терминала — альтернатива терминалу GNOME , Alacritty или Терминал Windows.

Related posts

Обучение на рабочей неделе важнее, чем вы думаете

Обучение на рабочей неделе важнее, чем вы думаете

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

Революция на рабочем месте: ведущие эксперты обсуждают гибридную и удаленную работу

Революция на рабочем месте: ведущие эксперты обсуждают гибридную и удаленную работу

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

Что вы можете сделать в свой сезон ожидания (в ожидании вашей первой работы в сфере технологий)

Что вы можете сделать в свой сезон ожидания (в ожидании вашей первой работы в сфере технологий)

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

Всегда ли искусство аполитично?

Всегда ли искусство аполитично?

Вчера мы закрыли двери конкурса песни «Евровидение» в этом году блестящим, хаотичным грандиозным финалом, в котором шведская певица Лорин забрала домой трофей, став первой женщиной, выигравшей дважды, и вернув корону Швеции спустя 50 лет после того, как ABBA выиграла конкурс. с «Ватерлоо». Они стали одним из крупнейших исполнителей в каноне поп-музыки.