Расширение протокола, где Self - это ClassA или ClassB - PullRequest
0 голосов
/ 27 мая 2019

У меня есть протокол, для которого я хочу предоставить функциональность по умолчанию в случае, если соответствующий класс равен либо ClassA ИЛИ ClassB.Можно ли использовать || в расширении протокола where?Я пробовал следующее, но это не работает:

extension Protocol where Self: ClassA || Self: ClassB {
    func method() {
        // implementation if conforming class is ClassA OR ClassB
    }
}

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Нет, вы не можете использовать || (или что-то эквивалентное) в предложении where расширения протокола.

Если метод расширения нуждается в определенной функциональности, присутствующей как в ClassA, так и ClassB, то вы можете определить это в протоколе (которому соответствуют оба класса) и ограничить расширение этим протоколом.

0 голосов
/ 27 мая 2019

Это просто невозможно в данный момент. Одним из решений может быть создание двух разных расширений.

extension Protocol where Self: ClassA {
    func method() {
        commonMethod()
    }
}

extension Protocol where Self: ClassB {
    func method() {
        commonMethod()
    }
}

private func commonMethod() {
    // do here your stuff
}

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

protocol CommonProtocol {}

class ClassA: Protocol, CommonProtocol {}

class ClassB: Protocol, CommonProtocol {}

extension Protocol where Self: CommonProtocol {
    func method() {
       // your stuff
    }
}
...