2016-11-21 79 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 
    } 
} 

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

相關問題