2014-09-09 4 views
20

В Swift, как мы определяем протокол, который расширяет или специализирует базовый протокол? Документация, похоже, не делает этого ясно.Как продлить протокол в Swift

Также неясно, протоколы Swift соответствуют/расширяют протокол NSObject? Это интересный вопрос, поскольку он намекает на то, что Swift использует диспетчер vtable или сообщений для вызова методов протокола.

ответ

28

Наследование протокола использует регулярный синтаксис наследования в Swift.

protocol Base { 
    func someFunc() 
} 

protocol Extended : Base { 
    func anotherFunc() 
} 

Протоколы Swift по умолчанию не соответствуют NSObjectProtocol. Если вы решите, что ваш протокол соответствует NSObjectProtocol, вы ограничите свой протокол только тем, который используется с классами.

7

Синтаксис такой же, как если бы вы объявляли класс, унаследованный от суперкласса.

protocol SomeProtocol { } 

protocol SomeOtherProtocol: SomeProtocol { } 

И нет, они этого не делают. Если вы хотите, чтобы ваш протокол также соответствовал NSObjectProtocol, вы можете предоставить несколько протоколов для вашего нового протокола таким образом.

protocol SomeOtherProtocol: SomeProtocol, NSObjectProtocol { } 
+0

Большое спасибо. Принял ответ Коннора, когда он пришел за одну минуту раньше, и представил интересный момент о том, что NSObjectProtocol ограничивается классами. –