Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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() {}
}