我怎样才能“显式”地快速实现一个协议?如果不可能,为啥?

Posted

技术标签:

【中文标题】我怎样才能“显式”地快速实现一个协议?如果不可能,为啥?【英文标题】:How can I "explicitly" implement a protocol in swift? If it is impossible, why?我怎样才能“显式”地快速实现一个协议?如果不可能,为什么? 【发布时间】:2017-05-02 16:39:05 【问题描述】:

在 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"

我在 Internet 上找到了 this,但我认为这无关紧要,因为它似乎是关于在子类中强制方法覆盖。

【问题讨论】:

你的问题我不是很清楚,一个类型可以采用两个具有相同方法名的协议,比较***.com/questions/31586864/…。 我知道。但是我想要一种类型来实现两个具有相同方法签名的协议不同地,就像在 MSDN 示例中一样。我想要的主要事情实际上是实现类似于问题中的代码 sn-p 的东西,即通常,someJob.description 返回一个值,但是当您通过执行(someJob as CustomStringConvertible).description 访问description 时,它返回另一个值。 @MartinR 问题是,我不确定这是否适合 swift。这就是为什么我问Does this conflict with any of swift's ideologies?。另外,我真的不知道如何写提案...@matt 更深层次的问题不是“它是否与意识形态冲突”,而是“它允许开发人员以优雅的方式解决的重要问题是什么?”每个新功能都是复杂的。这个功能给我们带来了什么,它的复杂性又值多少钱?我在这里看到的唯一好处是Job 不符合CustomStringConvertible,但碰巧实现了一个具有相同名称但语义冲突的方法,并且(出于某种未知原因),它是不可能改变Job。因此,对于一个尴尬的问题,这是一个令人困惑的解决方法。 就我个人而言,我不明白为什么这是一个“很棒的语言功能”。如果我被允许称鸭子为猫,并且当我告诉它嘎嘎叫它时,它会喵喵叫而不是嘎嘎叫,那不是“好”——这是“疯狂”。多态性的全部意义在于对象具有完整性;它对一个方法的实现取决于它是什么,而不是你如何cast它。协议扩展已经把事情搞砸了。 【参考方案1】:

协议扩展基本上已经做了你所描述的:

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

【讨论】:

而且,我可以补充一点,就协议扩展 do 已经完成您所描述的事情而言,它们是一种恐怖。这种行为让大量程序员感到困惑。 哦,我从没想过协议扩展会这样! @Sweeper:请注意,这仅在协议定义本身中列出该方法时才有效。如果您将func quack() 添加到protocol Cat,那么无论您如何称呼它,鸭子都会嘎嘎叫。

以上是关于我怎样才能“显式”地快速实现一个协议?如果不可能,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

72.8接口和内省

C# 显式接口成员实现

我怎样才能制作一个可能有也可能没有定义的字段的结构?

mac上怎样才能快速切换登录多个用户?

我怎样才能有效地找到在预算范围内并最大化效用的活动子集?

我怎样才能更好地将这个按钮与中间的内容对齐?对我来说似乎偏离了中心: