Сравнение протокола в 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).