2015-09-11 3 views
4

В последнее время я немного запутался в определении путей быстрого доступа к протоколу.В чем разница между этим определением протокола?

protocol OneDelegate : class

или

protocol OneDelegate : NSObjectProtocol

или

@objc protocol OneDelegate

или

@class_protocol protocol OneDelegate

И будем ли мы продолжать использовать слабых для делегата? Или как unowned(unsafe) var dataSource: UITableViewDataSource?

Спасибо за помощь!

ответ

4

Первый и последний на самом деле то же самое. Оба указывают, что протокол может быть принят только классом, т. Е. Структура не может принять протокол. Предпочтительна форма protocol OneDelegate : class. И @class_protocol protocol OneDelegate устарел.

Второй случай - это способ расширить существующий протокол. Скажем, например, вы хотите ваш UITableViewDelegate реагировать на длительное нажатие, то вы могли бы определить протокол:

protocol UITableViewDelegateWithRecognizer: UITableViewDelegate { 
    func longPressed() 
} 

Тогда соответствие протоколу UITableViewDelegateWithRecognizer требует соответствия для всех UITableViewDelegate функций, а также дополнительный метод longPressed.

Вам необходимо использовать @objc, если вы намерены использовать протокол в файле, написанном в Objective-C. Кроме того, если вы хотите иметь необязательную декларацию функции, вам необходимо использовать @objc.

Наконец, те же правила ARC для управления памятью применяются к Swift как Objective-C, поэтому вы часто захотите использовать спецификатор weak. Одно из предостережений состоит в том, что многие объекты Swift являются типами значений, а не ссылочными типами. И вы не можете иметь слабую ссылку на тип значения. Поэтому, если вам нужно использовать слабую ссылку, чтобы избежать цикла сохранения, тогда вы должны указать, что протокол - это протокол класса, т. Е. Ваш первый пример.

+0

приятный ответ + 1'd – aug2uag

+0

благодарю вас за ответ. это действительно полезно. – RayChen

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