我可以声明一个符合Swift协议的特定类的类型吗?

时间:2016-11-21 19:17:11

标签: swift

如果我有以下代码:

class MyClass {
    ...
}

protocol MyProtocol {
    ...
}

是否可以声明一个接受MyClass符合MyProtocol的类或子类的类型?

e.g。在伪代码中:

var thing: MyClass & MyProtocol = ...

2 个答案:

答案 0 :(得分:0)

天真的方法有效(即首先指定类型,然后在变量声明中使用它):

class MCImplementingMP: MyClass, MyProtocol {   
}

var thing: MCImplementingMP = ...

答案 1 :(得分:0)

不,在Objective-C中它是可能的,但在Swift中是不可能的。 我所知道的所有解决方案看起来都很糟糕,需要大量的运行时类型检查。所以我自己出来了 - 声明一个包装类型,根据具体情况,它可以像所需的类或协议一样:

class MyClass {}
protocol MyProtocol: class {}

class Wrapper {
    var instance: AnyObject
    init?(instance: MyClass) {
        guard instance is MyProtocol else { return nil }
        self.instance = instance
    }

    init?(instance: MyProtocol) {
        guard instance is MyClass else { return nil }
        self.instance = instance
    }

    var instanceAsMyClass: MyClass {
        return instance as! MyClass
    }

    var instanceAsMyProtocol: MyProtocol {
        return instance as! MyProtocol
    }
}

您可能想要更改属性名称,但想法很明确。