切换案例以检查ViewControllers是否符合协议

时间:2018-03-13 14:19:52

标签: swift switch-statement protocols

我有一个协议......

protocol MyProtocol {}

我的一些视图控制器符合此协议......

class MyViewController: UIViewController, MyProtocol {}

其中一些人没有......

class OtherViewController: UIViewController {}

现在......我有一个需要两种UIViewController类型的函数。根据他们的类型,我需要做不同的事情。

所以我有一个开关。在那个交换机中,我有时需要检查特定的类型,有时我需要检查协议的一致性。

switch (firstVC, secondVC) {
case is (MyViewController, OtherViewController):
    // do something this works
case is (OtherViewController, MyViewController):
    // do something else this works
case is (MyProtocol, MyProtocol):
    // this breaks...
}

我得到的错误是......

  

从(UIViewController,UIViewController)转换为不相关的类型(MyProtocol,MyProtocol)总是失败

但我知道事实并非如此。

如何检查UIViewControllers与我的协议的一致性?

由于

2 个答案:

答案 0 :(得分:0)

错误的共鸣是你无法将元组投射到任何东西,特别是不是成员。

你可以使用case-let:

switch (firstVC, secondVC) {
    case (let mvc as MyViewController, let ovc as OtherViewController):
        // do something with mvc and ovc
    case (let ovc as OtherViewController, let mvc as MyViewController):
        // do something else
    case (let m1 as MyProtocol, let m2 as MyProtocol):
        // this breaks...
}

答案 1 :(得分:-1)

根据@MartinR评论。

我可以用......

case let (_ as MyProtocol, _ as MyProtocol):

我可以发誓我以前曾尝试过。

事实上我需要在我的情况下做更多检查,所以我做了这个......

case let (a as MyProtocol, _ as MyProtocol) where !(a is MyViewController):

或者其他类似的东西。