Первый и последний на самом деле то же самое. Оба указывают, что протокол может быть принят только классом, т. Е. Структура не может принять протокол. Предпочтительна форма 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 являются типами значений, а не ссылочными типами. И вы не можете иметь слабую ссылку на тип значения. Поэтому, если вам нужно использовать слабую ссылку, чтобы избежать цикла сохранения, тогда вы должны указать, что протокол - это протокол класса, т. Е. Ваш первый пример.
приятный ответ + 1'd – aug2uag
благодарю вас за ответ. это действительно полезно. – RayChen