Дополняя ответ @Thomas Schar. Магия протокола Swift происходит от расширения.
- Протоколы Swift могут получить реализации через расширение (Swift
2). Интерфейс Java 8 может иметь реализации по умолчанию, но это невозможно сделать «задним числом».
- В Swift вы можете «задним числом» добавить требования к протоколу (и
его реализации, если необходимо) в любой класс или структуру.
- Протоколы Swift следуют не общему (т. Е. <..>) шаблону настройки, а схеме typealias (т. Е. Ассоциированным типам). Может быть запутанным в начале, но может избежать
«слепоты угловых скобок» в некоторых случаях.
- Swift имеет расширенное сопоставление шаблонов типов, позволяющее очень точно определить, где и как применяются требования и расширения протокола. Это может сбивать с толку, когда приходит с Java, но у него много силы.
- Быстрый протокол может быть составлен для свойства / параметра (например, празднователь: протокол)
Одна вещь, которая заставила меня почесать голову на пару часов, это то, что не все протоколы могут использоваться в качестве типов свойств. Например, если у вас есть протокол с typealias, вы не можете напрямую использовать его как тип свойства (это имеет смысл, когда вы думаете об этом, но исходя из Java, мы действительно хотим иметь свойство, подобное userDao: IDao).