Протоколы только для классов в Swift

Я хочу, чтобы некоторые из моих классов (не все) соответствовали «Протоколы только для классов» из документов. То, что я делаю, это

protocol RefreshData: class, ClassA, ClassB { func updateController() } 

и я получаю ошибки

 non class type 'RefreshData cannot inherit from classA non class type 'RefreshData cannot inherit from classB 

Я не уверен, что я следую точно так же, как в документах. У кого-нибудь есть идеи об этом?

4 Solutions collect form web for “Протоколы только для классов в Swift”

Проблема в том, что вы пытаетесь ограничить определенные классы, и Swift не может этого сделать (на данный момент в любом случае). Вы можете ограничивать классы и наследовать от других протоколов. Ваш синтаксис предназначен для наследования протокола, но вы пытаетесь использовать его как ограничение класса.

Обратите внимание, что целью протоколов класса является:

Используйте протокол только для класса, если предполагается, что поведение, определенное требованиями этого протокола, требует, чтобы соответствующий тип имел ссылочную семантику, а не семантику значений.

Ответы Криса и Вайна верны. Я просто добавляю здесь несколько подробностей.

Определение протокола

Вы должны различать концепцию объявления protocol (доступного для классов)

 protocol RefreshData: class { func updateController() } 

Определение класса

… из концепции соответствия вашего класса протоколу

 class ClassA: RefreshData { func updateController() { } } 

Соответствие классу, которому вы не владеете

Иногда вы хотите согласовать класс с протоколом, но у вас нет исходного кода для этого класса. В этом случае вы можете использовать extension

 extension ClassB: RefreshData { func updateController() { } } 

Последняя версия Swift может это сделать! Я бы сделал протокол и расширения протокола, которые нацелены на нужные классы! (ограничение расширения на определенный класс)

  protocol Movable { func moveForward() func moveBackward() } extension Movable where Self: Car { func moveForward() { self.location.x += 10; } func moveBackward() { self.location.x -= 10; } } extension Movable where Self: Bike { func moveForward() { self.x += 1; } func moveBackward() { self.x -= 1; } } class Car: Movable { var location: CGPoint init(atLocation location: CGPoint) { self.location = location } } class Bike: Movable { var x: Int init(atX x: Int) { self.x = x } } 
 protocol RefreshData : class { func updateController() } class ClassA : RefreshData { func updateController() {} } class ClassB : RefreshData { func updateController() {} } 
  • Ошибка UITableVIewCell Xcode 7 / Swift 2
  • Как получить номер телефона входящего звонка в iOS Swift?
  • Изменение размера UISearchBar в UINavigationBar titleView не работает
  • Трансформация глубины страницы на iOS
  • Сохранить ближайший объект для учетной записи пользователя google в Swift2
  • UIViewController больше не имеет элементов topViewController или viewControllers в XCode 7
  • Как реализовать общий блок try-try-catch, чтобы поймать все ошибки, которые бросаются на операцию
  • sendAsynchronousRequest устарел в iOS 9
  • Аутентификация сервера в Swift 2.0 и XCode 7 сломана
  • Не уверен, как конвертировать мой быстрый 1.2 в 2.0 или если я должен
  • Swift 2: расширение протокола UITableViewDataSource
  • Interesting Posts

    Xcode добавляет тире к моему идентификатору пакета

    Почему мы используем , а не или

    Facebook FBSDKAppInviteContent – Отсутствует URL ссылки на приложение

    Вертикальное scrollview, конфликтующее с вертикальной навигацией

    Экспортировать сертификат уведомления об отправке в виде P12

    Доступ к источнику 120 видео FPS на iPhone 5S?

    iOS – UIProgressView обновляется только один раз

    iOS / мобильное сафари по-прежнему масштабируется, а в окне просмотра установлено значение «user-scaleable = no? Проверьте настройки специальных возможностей!

    Имя экрана Twitter, возвращающее нуль в Parse

    Каков наилучший способ загрузки ландшафтных и портретных xib-файлов для uitableviewcells?

    iOS, CoreAudio: странная ошибка «CADebugPrintf.h: no такой файл или каталог …»

    Сделайте скриншоты в симуляторе iOS

    iOS – добавление / удаление подпрограммы программно

    Прокрутка UITextView снизу без анимации

    Как разделить одну сцену раскадровки между несколькими UIViewControllers

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.