Слабое требование к свойствам в протоколе Swift со связанным типом

Я хочу написать протокол со слабым требованием к свойствам. Соответствующий класс должен иметь возможность указать любой тип этого свойства. Также я не хочу указывать фактический тип, поэтому он должен быть типом, указанным с некоторым протоколом. Этот код показывает мою идею для слабого свойства:

protocol ObjectProtocol: class { typealias PropertyType var property: PropertyType {get set} } protocol FirstPropertyProtocol: class {} protocol SecondPropertyProtocol: class {} class FirstObjectImpl: ObjectProtocol { var property: FirstPropertyProtocol? } class SecondObjectImpl: ObjectProtocol { var property: SecondPropertyProtocol? } 

Он работает так, как ожидалось.

Я пытался сделать то же самое для слабого свойства:

 protocol ObjectProtocol: class { typealias WeakPropertyType: AnyObject //must be a class type weak var weakProperty: WeakPropertyType? {get set} } protocol WeakPropertyProtocol: class {} class ObjectImpl: ObjectProtocol { weak var weakProperty: WeakPropertyProtocol? } 

И я получил ошибку компилятора:

Тип 'ObjectImpl' не соответствует протоколу 'ObjectProtocol'

Есть ли способ сделать эту работу?

Я не верю, что протокол может обеспечить слабость. Например:

 protocol ObjectProtocol: class { weak var weakProperty: AnyObject? {get set} } class ObjectImpl1: ObjectProtocol { weak var weakProperty: AnyObject? } class ObjectImpl2: ObjectProtocol { var weakProperty: AnyObject? } 

Оба они компилируются нормально, хотя протокол weak но ObjectImpl2 не реализует его.

EDIT: Это то, что вам нужно? …

 protocol ObjectProtocol: class { typealias WeakPropertyType: Any //must be a class type var weakProperty: WeakPropertyType? {get set} } protocol WeakPropertyProtocol: class {} class ObjectImpl: ObjectProtocol { typealias WeakPropertyType = WeakPropertyProtocol weak var weakProperty: WeakPropertyProtocol? } 

Для этой реализации требуется использование Any, а не AnyObject, поскольку WeakPropertyProtocol – это протокол, а не класс.

Или это?…

 protocol WeakPropertyProtocol: class {} protocol ObjectProtocol: class { typealias WeakPropertyType: AnyObject //must be a class type var weakProperty: WeakPropertyType? {get set} } class MyWeakClass: WeakPropertyProtocol { } class ObjectImpl: ObjectProtocol { typealias WeakPropertyType = MyWeakClass weak var weakProperty: MyWeakClass? } 

В любом случае, я думаю, что ключ заключается в определении того, какой класс / протокол использовать для WeakPropertyType .

Я сделал это с атрибутом @objc для WeakPropertyProtocol:

 protocol ObjectProtocol: class { typealias WeakPropertyType: AnyObject //must be a class type weak var weakProperty: WeakPropertyType? {get set} } @objc protocol WeakPropertyProtocol {} class SomeObjectImpl: ObjectProtocol { weak var weakProperty: WeakPropertyProtocol? } 

Это не лучшее решение, потому что я отношусь к этой заметке из apple doc

Также обратите внимание, что протоколы @objc могут быть приняты только классами, которые наследуются от классов Objective-C или других классов @objc.

Я могу жить с этим ограничением, но я буду признателен за лучшее решение.

Swift 4 версия.
Мне нужно, чтобы мои модели представлений соответствовали протоколу. Нельзя сохранить объект-координатор:

 protocol ViewModelType { associatedtype CoordinatorType: AnyObject weak var coordinator: CoordinatorType? { get } } 
  • Расширение WatchKit не видит данные, сохраненные в NSUserDefaults с группой приложений
  • UIBezierPath addClip и drawRect
  • ios 10+, Swift 3+ - Не удается отменить UIAlertController из экземпляра Singleton
  • Использование файлов C с Swift, вызывающих ошибку компоновщика
  • Использование команды «po» в Xcode 6 beta 5 Отладка выбранных представлений
  • Остановить повторное использование пользовательских ячеек Swift
  • Как добавить символ в строку в Swift?
  • Передайте объект данных в UITableViewCell и используйте его из встроенного контроллера ячейки
  • Сделать UIModalTransitionStyle Посмотрите, как быстро нажать
  • Проблема с повторяющимися сообщениями При переходе на ViewController
  • Может ли среда Swift ссылаться на другие расширения класса Swift?
  • Interesting Posts

    Что может привести к непредвиденным сбоям для приложения iphone?

    Региональная локализация iOS8 (например, pt-BR)?

    tableView convertPoint: fromView: нечетное поведение и обходное решение

    UIDocumentInteractionControllerDelegate завершит предварительный просмотр?

    Загрузка библиотеки или снятых изображений на iOS с помощью Flex Mobile 4.6

    Изменение угла перспективы справа налево, в iOS CATransformLayer с использованием CATransform3D

    Передача «правильных» данных из выбранной ячейки в UITableViewController в ViewController

    UITextField изменяет шрифт во время редактирования

    Как отобразить описание предмета покупки в приложении?

    Пустой первый заголовок раздела UITableView

    Настроить изображение навигационной панели в iOS 7

    Управление скриншотом в многозадачном коммутаторе iOS 7

    Расшифровка AES в iOS: заполнение PKCS5 и CBC

    Добавление UIStackView в качестве пустого контейнера в раскадровке

    В чем разница между пользовательским классом и параметром владельца файла в файле xib?

    Давайте будем гением компьютера.