В Swift объявляют переменную протокола, которая должна соответствовать хотя бы одному протоколу

Как определить переменную в протоколе в Swift4, которая, по крайней мере, должна соответствовать протоколу, но также может соответствовать и другим протоколам?

Например, теперь я получаю сообщение об ошибке, если протокол объявляет, что переменная должна соответствовать протоколу B, и я хочу, чтобы переменная в реализации соответствовала совокупности различных протоколов (B + C).

 // For example: Presenter can conform to default stuff
    protocol A {
        var viewController: C? { get set }
        func presentDefaultStuff()
    }

    extension protocol A {
       func presentDefaultStuff() {
            viewController?.displayDefaultStuff()
       }

    // Presenter can conform to custom stuff
    protocol B {
       func presentCustomStuff()
    }

    // viewController can conform to default stuff
    protocol C {
        func displayDefaultStuff()
    }

   // viewController can conform to custom stuff
    protocol D {
        func displayCustomStuff()
    }

    class SomeClass: A & B {
        // Gives an error: Type 'SomeClass' does not conform to protocol 'A'
        // because protocol A defines that viewController needs to be of    
        // type C?
        var viewController: (C & D)?
    }

Отредактировано: я отредактировал свой исходный пост, чтобы сделать вопрос более ясным, я также нашел решение, чтобы сделать то, что я хотел достичь: я могу разделить класс и сделать расширение для реализации, которое соответствует одному из протоколов, например:

class someClass: B {
    customViewController: (C & D)?
}

extension someClass: A {
    var viewController: C? {
       return customViewController
    }
}

Компилятор проверяет тип, что customViewController соответствует C?.

0 ответов

Другие вопросы по тегам