Определите 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 является слишком общим, и поэтому вы не можете его сделать