在Swift中声明必须符合至少一个协议的协议变量

时间:2018-07-12 21:08:02

标签: swift generics protocols associated-value

如何在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 个答案:

没有答案