Когда и почему я должен использовать протоколы в Swift? - PullRequest
0 голосов
/ 18 ноября 2018

Итак, я наткнулся на тему протоколов, и я искал в Интернете кучу ответов, но не смог найти ни одного, по крайней мере, такого, который решил бы мою проблему.

Итак, я понимаю, что протоколы - это«План» методов, свойств и тому подобное, и что он может быть реализован в классе или структуре и что ему нужно соответствовать его требованиям и тому подобное, но зачем использовать один?

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

Есть ли конкретная причина, по которой можно использовать протокол?Это для безопасности вашего кода или по какой-то другой причине?

Например:

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

Так что, если кто-то мог бы пролить свет на эту тему, это было бы здорово.

Спасибозаранее!

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Протокол в swift - это шаблон, позволяющий вашим классам подтверждать определенный набор правил.

Другими словами, протокол - это схема методов и свойств, необходимых для конкретной задачи.

Вы реализуете протокол, подтверждая его.Если ваш класс пропустил реализацию какого-либо метода, определенного в протоколе, вам скажет быстрый компилятор.

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

Протоколно-ориентированное программирование - это новая парадигма программирования.Это решает некоторые проблемы, связанные с объектно-ориентированным программированием.Как множественное наследование.Swift не допускает множественное наследование, но он позволяет подтверждать несколько протоколов.

Очень просто удалить некоторые функциональные возможности из класса в программировании, ориентированном на протокол.Вы просто перестаете соответствовать этому.По сравнению с ООП, такие вещи очень просто делать в POP.

0 голосов
/ 18 ноября 2018

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

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

class CustomActionSheet: UIControl {

    func userTappedOnSomething() {
        // user tapped on something
    }

}

... и вы реализовали его в одном из ваших контроллеров представления.

class SomeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let actionSheet = CustomActionSheet()
    }

}

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

class CustomActionSheet: UIControl {

    weak var delegate: UIViewController?

    func userTappedOnSomething() {
        delegate?.userTookAction()
    }

}

class SomeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let actionSheet = CustomActionSheet()
        actionSheet.delegate = self

    }

    func userTookAction() {
        // update the UI
    }

}

Теперь, когда пользователь нажимает кнопку на листе действий, контроллер представления внизу может обновить свой пользовательский интерфейс.Но это на самом деле не скомпилируется.Вы получите ошибку, что UIViewController не имеет члена userTookAction.Это связано с тем, что у класса UIViewController нет метода с именем userTookAction, только у этого экземпляра контроллера представления.Поэтому мы используем протокол:

protocol ActionSheetProtocol: AnyObject {
    func userTookAction()
}

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

class CustomActionSheet: UIControl {

    weak var delegate: ActionSheetProtocol?

    func userTappedOnSomething() {
        delegate?.userTookAction()
    }

}

class SomeViewController: UIViewController, ActionSheetProtocol {

    override func viewDidLoad() {
        super.viewDidLoad()

        let actionSheet = CustomActionSheet()
        actionSheet.delegate = self

    }

    func userTookAction() {
        // update the UI
    }

}

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

Примечание: В этом примере я назвал протокол ActionSheetProtocol, потому что для кого-то, изучающего протоколы,это имеет смысл.Однако в мире Swift в сегодняшней практике большинство программистов (включая парней из Apple) назвали бы это ActionSheetDelegate.Это может сбивать с толку тех, кто изучает протоколы, поэтому в этом примере я попытался сделать это как можно более понятным.Лично мне не нравятся имена делегатов протоколов, но есть много вещей, которые мне не нравятся.

Примечание 2: Я также сделал протокол типа AnyObject, который является синтаксисом Swiftдля того, чтобы сделать протокол протоколом класса.Не все протоколы должны быть типа AnyObject.

0 голосов
/ 18 ноября 2018

но зачем его использовать?

Protocols в swift похожи на Abstractions в некоторых других языках.

прежде чем ответить на ваш вопрос, мы должны прояснить ситуацию, Protocols объявление может быть различным, но, учитывая, что вы уже прочитали его тонны,

Также было бы здорово упомянуть этот ответ здесь .

Теперь давайте перейдем к реальному варианту использования здесь.

Считайте, что у вас есть этот протокол.

protocol Printable {
var name: String { get }
}

Теперь нам нужен тип structs или classes для подтверждения или Multiple .

И здесь, где он лежит одно из самых больших преимуществ этого.

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

Например, те.

    struct Human {
    var name: String
}
struct Animal {
    var name: String
}

Вы бы просто набрали это без Protocols

    func printOut(human: Human){
    human.name
   }

   func printOut(animal: Animal){
    animal.name    
   }

Что правильно, теперь соблюдайте приведенный ниже код, используя протокол Printable.

struct Human: Printable {
    var name: String
}
struct Animal: Printable {
    var name: String
}

 func printOut(object: Printable){
    print(object.name)
   }

Это займет у нас всего один func и т. Д. С использованием Protocols.

Заключение

Протоколы, используемые для минимизации ненужных фрагментов кода.

Это название представляет эффект, применяемый к партии подтверждения.

Протоколы могут быть введены как типы параметров.

Вы также можете узнать больше о них здесь .

И еще о случаях использования здесь .

...