Протоколы только для классов в 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() {} } 
  • невозможно получить имя контакта, используя структуру ABAddressBook в IOS Swift 2.0
  • Свифт был гарантирован
  • Как мы можем использовать HTTP и HTTPS как ATS (безопасность транспорта приложений) в одном приложении?
  • Физическое тело для SKLabelNode в SpriteKit?
  • AdMob 7.3.1 и Swift 2.0 - модуль не найден
  • Swift 2: «Bool» не конвертируется в «BooleanLiteralConvertible»
  • subview scroll не работает SWIFT
  • Swift 2.0 Формат 1000 в дружественный K
  • Как разрешить ошибку, показывающую, как имя файла используется дважды
  • AVAudioPlayer не воспроизводит звук
  • Неоднозначное использование индекса xcode 7.1
  • Interesting Posts

    Может ли geocodeAddressDictionary в iOS 9 быть реализован в отличие от iOS 8

    Open GL Error: использование необъявленного идентификатора gl_FragColor

    Режим фона Apple Watch?

    Индикатор активности отображения внутри UIButton

    Проект Xcode iOS показывает только «Мой Mac 64-бит», но не симулятор или устройство

    Как получить makeStatic или makeDynamic методы в LHBezier? УровеньHelper – Cocos2D

    Сравнение дат месяца с массивом

    iOS. Возможно ли, что вернет только часть байтов содержимого?

    Могу ли я использовать структуры Swift 2.3 в проекте Swift 3?

    Преобразование NSString в NSDate

    NSUrlSession приостанавливает и возобновляет выпуск блокировки устройства

    Индикатор пользовательской активности

    Динамическая высота ячейки UITableView с помощью AutoLayout с ярлыками динамического типа

    Воспроизвести видео YouTube в приложении iPhone без использования UIWebView?

    Не удается найти свое местоположение в Google Картах в iOS 8

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