Определите Swift typealias для любого объекта, который реализует несколько протоколов

Я пытаюсь определить typealias для свойства делегирования UITableViewCell, которое соответствует нескольким протоколам. Это то, что я пытаюсь сделать, и Свифт жалуется, что мой синтаксис неверен:

// The typealias definition
typealias CellDelegate = AnyObject<UIPickerViewDataSource, UIPickerViewDelegate>

// In my UITableViewCell subclass:
weak var delegate: CellDelegate?

"Невозможно специализировать не общий тип AnyObject" - это ошибка, которую я получаю. Как это сделать правильно?

Ответы

Ответ 1

Код, который вы опубликовали, отличается от того, что вы ожидаете. Вы рассматриваете AnyObject как общий тип, с UIPickerViewDataSource и UIPickerViewDelegate как аргументы типа. Это то же самое, что создавать клавиши Dictionary с Int и String значениями, например:

var someDictionary: Dictionary<Int, String>

То, что вы пытаетесь выполнить, требует другой конструкции, называемой составом протокола. Swift предоставляет его специально для выражения типов, которые соответствуют нескольким протоколам. Его синтаксис следующий: вы можете использовать его везде, где вы можете использовать обычные типы:

FirstProtocol & SecondProtocol

С помощью этой функции ваш код станет следующим:

// The typealias definition
typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate

// In my UITableViewCell subclass:
weak var delegate: CellDelegate?

Состав протокола объясняется в руководстве Apple на языке Swift, здесь.

EDIT: Обновлен до Swift 3, спасибо @raginmari

Ответ 2

если вы хотите объявить multiprotocol:

protocol<A, B>

Ответ 3

Я не понимаю, почему вы вводите такой weak var delegate: <CellDelegate>? и почему вы не набираете weak var delegate: CellDelegate?

Проблема в том, что AnyObject является общим. С первой строкой вы пытаетесь сделать AnyObject неэквивалентным, и это не так.

Лучше создать класс, который реализует эти (источник данных и делегат).

Ответ 4

С Swift 3 синтаксис изменился.

До Swift 2.3: typealias CellDelegate = protocol<UIPickerViewDataSource, UIPickerViewDelegate>

Так как Swift 3: typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate

Ответ 5

Вы должны передать известный объект, AnyObejct является слишком общим, и поэтому вы не можете его сделать