3

Я понимаю, какие целевые протоколы служат (чтобы тип соответствовал установленному списку методов или/и свойств), но я не понимаю, в чем цель протокола со всеми необязательными методами. Одним из примеров будет UITextFieldDelegate.Какова цель протоколов, если все методы являются необязательными?

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

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

+0

проверить этот вопрос также http://stackoverflow.com/questions/691246/why-would-i-make-an-all-optional-message-protocol?rq=1 это может помочь вам –

+0

все отличные ответы. комментарий к другому делу был очень полезным. Я думаю, что причина для всех факультативных протоколов в основном используется для делегатов. Я проверил ответ, похожий на другой вопрос, но все предоставленные ответы имеют смысл. Еще раз спасибо всем !!! – Chris

ответ

1

Исторически для делегатов и источников данных в Какао использовались неофициальные протоколы. Неформальный протокол был реализован корыту категории для NSObject класса:

@interface NSObject (NSTableViewDelegate) 

- (int)numberOfRowsInTableView:(NSTableView *)tableView; 

// ... 

@end 

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

Кроме того, это изменение приводит к более сильным проверкам во время компиляции. Если программист случайно присваивает неправильный объект delegate или dataSource свойствам, компилятор будет предупреждать.

Но ваше предположение также верно. Дополнительные методы также являются предложениями по возможной функциональности.

1

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

Если все методы являются необязательными в протоколе, почему бы вам соответствовать протоколу, а не просто писать функции с нуля в вашем классе?

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


Например, протокол UIScrollViewDelegate определяет только необязательные методы. Допустим, у нас есть класс Foo, который мы хотим знать, когда все меняется с помощью UIScrollView.

Если мы решили отбросить этот протокол и реализовать функции с нуля, как мы скажем UIScrollView, какие методы мы реализуем и какие методы вызывать при возникновении определенного события? Нет никакого хорошего способа узнать. Когда UIScrollView был построен, он не знал о Foo, поэтому он не может знать, какие методы он реализует. Кроме того, Foo не имеет способа узнать, какие методы могут быть вызваны на нем UIScrollView.

Однако, когда был построен UIScrollView, он действительно знал о UIScrollViewDelegate. Поэтому, если Foo соответствует протоколу UIScrollViewDelegate, теперь существует общее определение, которое может следовать как Foo, так и UIScrollView. Таким образом, Foo может реализовать любые методы, о которых он заботится, например scrollViewDidScroll:, а UIScrollView просто нужно проверить, реализовал ли делегат методы в UIScrollViewDelegate.

1

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

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

Например, рассмотрите протокол UITextFieldDelegate. Вы, как правило, согласны с этим, потому что хотите указать, например, разрешено ли определенным символам вставлять в текстовое поле или что делать, когда нажата клавиша возврата. Иногда вы только хотите реализовать первое. Иногда вы только хотите реализовать последнее. Иногда вы делаете оба. Но только потому, что вы решили реализовать одно или другое, не означает, что вы обязательно хотите сделать другое (но можете, если хотите). Честно говоря, хотя, если вы действительно не хотели реализовывать какие-либо из этих методов, вы, вероятно, даже не захотите указать delegate текстового поля, а также не указывать, что вы соответствуете протоколу.

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

Смежные вопросы