2016-11-21 97 views
0

如果我有以下代码:我可以声明一个符合Swift协议的特定类的类型吗?

class MyClass { 
    ... 
} 

protocol MyProtocol { 
    ... 
} 

是否有可能宣布接受类或MyClass符合MyProtocol子类型?

例如在伪码:

var thing: MyClass & MyProtocol = ... 
+0

可能重复[Swift protocol for UIViewController subclass](http://stackoverflow.com/questions/39596262/swift-protocol-for-uiviewcontroller-subclasses) – EmilioPelaez

+0

不幸的是没有。检查这个问题和答案。 http://stackoverflow.com/questions/39596262/swift-protocol-for-uiviewcontroller-subclasses/39596523#comment66501660_39596523 – EmilioPelaez

+1

你的英文句子说'或',但你的代码说'&'(和)。你要哪个? – Alexander

回答

0

简易方法有效(即指定型的第一,然后在变量声明使用它):

class MCImplementingMP: MyClass, MyProtocol { 
} 

var thing: MCImplementingMP = ... 
+0

不,它不工作。如果你想分配给'thing'作为'MyClass'的实例,符合'MyProtocol',但_is不是'MCImplementingMP'的实例? –

+0

这个问题将是**为什么**这不是一个例子......除了学术演习。如果有人使用“My ...”类型选择代码库,使用提供正确匹配的类型并不困难。 –

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 
    } 
} 

您可能要更改属性名称,但思路是清晰的。

相关问题