2015-01-20 3 views

ответ

7

Я разберусь с делами в несколько ином порядке:

  1. протокол может быть принят в перечислении, в структуры или класса.

  2. protocol FooDelegate: class {} означает, что этот протокол может быть принят только классом.

  3. @objc protocol FooDelegate {} раскрывает этот протокол Objective-C - Objective-C может «видеть» его. Это также подразумевает (2), т. Е. Теперь это протокол класса.

Хороший пример того, почему вы хотите сделать (2), когда вы хотите объявить слабый экземпляр свойства набранный в качестве протокола:

weak var delegate : MyDelegateProtocol 

Вы не можете сказать, если weak эта вещь является class instance - не struct или enum (поскольку они не имеют одинакового управления памятью). Объявление этого протокола как протокола класса успокаивает страхи компилятора, сообщая ему, что тот, кто принимает этот протокол , будет фактически быть классом.

Хорошим примером того, почему вы хотите сделать (3), является то, что вы хотите, чтобы ваш протокол имел необязательные элементы. Только Objective-C может это сделать, поэтому вы фактически превратите свой протокол в протокол Objective-C. И, конечно, протоколы , определенные в Objective-C, автоматически видны Swift как протоколы @objc.

+1

И см. Мой новый учебник Swift: http://www.apeth.com/swiftBook/ch04.html#_optional_protocol_members – matt

+0

Очень ясно, спасибо! – user2393462435

1

Чтобы добавить ответ Мэтта,

@objc протокола FooDelegate {} - это то же самое, как протокол FooDelegate, NSObjectProtocol {}?

Вы имеете в виду protocol FooDelegate : NSObjectProtocol {}? Нет. Оно не распространяется на NSObjectProtocol, если вы явно не объявите его как таковое.

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