2017-05-02 41 views
2

在C#中,有this great language feature稱爲「顯式接口實現」,允許您實現兩個或多個接口的方法名稱衝突的接口。它還可以使方法在使用封閉類型的對象調用它時執行一件事,並在將其轉換爲接口類型然後調用方法時執行另一件事。我想知道在Swift中是否有這樣的事情。這是否與任何斯威夫特的意識形態相沖突?我該如何「明確」地在swift中實現協議?如果不可能,爲什麼?

基本上我想要做這樣的事情:

struct Job: CustomStringConvertible { 
    var location: String 
    var description: String 
    var CustomStringConvertible.description: String { 
     return "Work Location: \(self.location), description: \(self.description)" 
    } 
} 

Job(location: "Foo", description: "Bar").description // "Bar" 
(Job(location: "Foo", description: "Bar") as CustomStringConvertible).description // "Work Location: Foo, description: Bar" 

我發現在互聯網上this但我不認爲這是相關的,因爲它似乎是有關強制方法重載的子類。

+0

你的問題並不完全清楚,我,一個類型* *可以採用具有同樣方法名兩個協議,比較的http://計算器。 COM /問題/ 31586864 /迅速-2-0 - 協議 - 擴展 - 雙協議 - 與最相同功能簽名-C。 –

+0

我知道。但是我想要一個類型來實現具有相同方法簽名的兩個協議_differently_,就像在MSDN示例中一樣。我想要的主要事情實際上是實現類似問題中的代碼片段,即通常'someJob.description'返回一個值,但是當您通過'(someJob as CustomStringConvertible).description'訪問'description'時,它返回另一個價值。 @MartinR – Sweeper

+0

問題是,我不確定這是否適合迅速。這就是爲什麼我問「這是否與任何迅速的意識形態相沖突?」。另外,我真的不知道如何編寫提案...... @matt – Sweeper

回答

2

協議擴展基本上已經做到你描述:

protocol Cat { 
} 
extension Cat { 
    func quack() { 
     print("meow") 
    } 
} 
class Duck : Cat { 
    func quack() { 
     print("quack") 
    } 
} 
let d = Duck() 
d.quack() // quack 
(d as Cat).quack() // meow 
+0

而且,我可以補充一點,協議擴展_do_已經完成了你所描述的內容,它們是一個恐怖的東西。這種行爲混淆了大量程序員。 – matt

+0

哦,我從來沒有想到,協議擴展的行爲就像這樣! – Sweeper

+2

@Sweeper:請注意,只有在協議定義本身中未列出方法時,此方法纔有效。如果你將'func quack()'添加到'protocol cat',那麼無論你怎麼稱呼它,鴨子都會嘎嘎。 –

相關問題