Сравнение протокола в Swift vs Interface в Java

Я изучаю учебник iOS из страницы разработчиков Apple.

Мне кажется, что protocol и interface имеют почти ту же функциональность.

  • Есть ли различия между этими двумя?

  • использование разности в проекте?

Обновлено

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

Ответ 1

По сути, протоколы очень похожи на интерфейсы Java, за исключением:

  • Протоколы Swift также могут указывать свойства, которые должны быть реализованы (например, поля)
  • Протоколы Swift должны обрабатывать значение/ссылку с помощью ключевого слова mutating (поскольку протоколы могут быть реализованы с помощью структур и классов)
  • вы можете комбинировать протоколы в любой точке с ключевым словом . Например, объявляя параметр функции, который должен придерживаться протоколов A и B как:

.

func foo ( var1 : protocol<A, B> ){}

Это сразу очевидные отличия для Java-разработчика (или, по крайней мере, то, что я заметил до сих пор).

Ответ 2

Дополняя @Thomas Schar ответ. Магия протокола Swift поступает из расширения.

  • Протоколы Swift могут получать реализации через расширение (Swift | 2). Интерфейс Java 8 может иметь стандартные реализации, но он не может быть сделано "задним числом".
  • В быстром режиме вы можете "ретроактивно" добавлять требования к протоколу (и его реализации при необходимости) для любого класса или структуры.
  • Протоколы Swift не соответствуют шаблону настройки общего типа (i.e <... > ), но схема типов (например, связанные типы). Может быть запутанным при запуске, но можно избежать в некоторых случаях - "слепота угловой скобки".
  • Swift имеет расширенное сопоставление шаблонов типов, что позволяет конкретный вопрос о том, где и как требования и расширения протокола применяется. Может быть запутанным при приеме с Java, но у него много власти.
  • Протокол Swift может быть скомпонован для свойства /param (т.е. celebrator: Протокол)

Одна вещь, которая заставила меня почесывать голову в течение нескольких часов, заключается в том, что не все протоколы могут использоваться как тип свойства. Например, если у вас есть протокол с typealias, вы не можете напрямую использовать его как тип свойства (это имеет смысл, если вы думаете об этом, но, исходя из Java, мы действительно хотим иметь свойство, подобное userDao: IDao).