В чем разница между этими тремя определениями протоколов в Swift?Определение протоколов в Swift
protocol FooDelegate {}
@objc protocol FooDelegate {}
- это то же самое, какprotocol FooDelegate, NSObjectProtocol {}
?protocol FooDelegate: class {}
В чем разница между этими тремя определениями протоколов в Swift?Определение протоколов в Swift
protocol FooDelegate {}
@objc protocol FooDelegate {}
- это то же самое, как protocol FooDelegate, NSObjectProtocol {}
?
protocol FooDelegate: class {}
Я разберусь с делами в несколько ином порядке:
протокол может быть принят в перечислении, в структуры или класса.
protocol FooDelegate: class {}
означает, что этот протокол может быть принят только классом.
@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
.
Чтобы добавить ответ Мэтта,
@objc протокола FooDelegate {} - это то же самое, как протокол FooDelegate, NSObjectProtocol {}?
Вы имеете в виду protocol FooDelegate : NSObjectProtocol {}
? Нет. Оно не распространяется на NSObjectProtocol
, если вы явно не объявите его как таковое.
И см. Мой новый учебник Swift: http://www.apeth.com/swiftBook/ch04.html#_optional_protocol_members – matt
Очень ясно, спасибо! – user2393462435