когда я должен использовать протокол для замены статической функции - PullRequest
0 голосов
/ 28 января 2019

Я смущен тем, когда использовать протокол / статическую функцию.

class A {
    func a() {
        B.b()
    }
}

class B {
    static func b() {
        print("do sth.")
    }
}

class A: B {
    func a() {
        self.b()
    }
}

protocol B {
    func b()
}

extension B {
    func b() {
        print("do sth.")
    }
}

Один протокол использования и один статическая функция.Какой из них лучше?

РЕДАКТИРОВАТЬ: Для более подробной информации, функция b () покажет предупреждение.A - Контроллер, который отправит запрос.Если это не удалось, должно быть показано предупреждение.Обратите внимание, что многие контроллеры должны показывать одно и то же предупреждение, поэтому я использую b () для их отображения.

1 Ответ

0 голосов
/ 28 января 2019

Один протокол использования и один использование статической функции.Какой из них лучше?

Это совершенно разные вещи, поэтому используйте тот, который делает то, что вам нужно:

протокол: Протокол определяет одинили больше функций, которые будут реализованы любым классом, который принимает этот протокол.Ваш class A принимает protocol B, поэтому вы можете передать экземпляр A любому методу, для которого требуется объект, соответствующий B.Могут быть классы C, D и E, которые также принимают протокол B, и в этом случае вы также можете передавать экземпляры любого из этих классов в тот же метод.

статическая функция: Статическая функция похожа на метод класса в Objective-C, то есть вы можете вызывать функцию, не нуждаясь в экземпляре класса, которому она принадлежит.Когда вы говорите B.b() в своем первом примере, вы делаете именно это - вызываете b() без экземпляра из B.

Приведенных вами примеровнастолько просты, что не понятно, что вы пытаетесь сделать, поэтому трудно сказать, что одно лучше другого.Однако при реальном использовании вы вряд ли их перепутаете.Рассмотрим, например, UITableViewDataSource: это протокол, который определяет интерфейс, которому должен соответствовать объект, выступающий в качестве источника данных для таблицы.Не имеет смысла пытаться делать это со статическими функциями - суть в том, что таблица не знает, какой должна быть реализация функций, подобных numberOfSections(in:), но ей нужно знать, какую функцию вызывать вобъект источника данных.

...