Протоколы только для классов в Swift
Я хочу, чтобы некоторые из моих классов (не все) соответствовали "Протоколы только для классов" из документов. То, что я делаю, это
protocol RefreshData: class, ClassA, ClassB
{
func updateController()
}
и я получаю ошибки
non class type 'RefreshData cannot inherit from classA
non class type 'RefreshData cannot inherit from classB
Я не уверен, что следую точно так же, как в документах. У кого-нибудь есть идеи об этом?
Ответы
Ответ 1
Swift 4 позволяет комбинировать типы, поэтому вы можете иметь свой протокол и затем создавать, например, псевдоним типа, чтобы объединить его с определенным требованием класса.
Для (надуманного) примера:
typealias PresentableVC = UIViewController & Presentable
Для представленного кода:
Проблема в том, что вы пытаетесь ограничить определенные классы, и Swift не может этого сделать (на данный момент в любом случае). Вы можете ограничивать классы и наследовать от других протоколов. Ваш синтаксис предназначен для наследования протокола, но вы пытаетесь использовать его как ограничение класса.
Обратите внимание, что целью протоколов класса является:
Использовать протокол только для класса, если предполагается, что поведение, определяемое требованиями к этим протоколам, требует, чтобы соответствующий тип имел ссылочную семантику, а не семантику значений.
Ответ 2
Ответы Криса и Вайна верны. Я просто добавляю несколько деталей здесь.
Определение протокола
Вы должны различать концепцию объявления protocol
(доступного для классов)
protocol RefreshData: class {
func updateController()
}
Определение класса
... из концепции соответствия вашего класса протоколу
class ClassA: RefreshData {
func updateController() {
}
}
Соответствие классу, которому вы не владеете
Иногда вы хотите, чтобы класс соответствовал протоколу, но у вас нет исходного кода для этого класса. В этом случае вы можете использовать extension
extension ClassB: RefreshData {
func updateController() {
}
}
Ответ 3
Последняя версия 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
}
}
Ответ 4
protocol RefreshData : class
{
func updateController()
}
class ClassA : RefreshData
{
func updateController() {}
}
class ClassB : RefreshData
{
func updateController() {}
}