这是一个正确的例子来展示Swift的面向协议的设计的好处吗?

时间:2016-06-05 18:47:24

标签: swift protocols

这个问题可能是非常错误的,我想要达到的结果也可能非常不清楚。我是一名编程入门者,请纠正我错误的理解。通过你的修正,我会学到很多东西。

在WWCD15的Session 408视频的06:00,Crusty抱怨的三大牛肉之一是“自动分享!”#34; swift的面向协议的特性可以很好地解决问题。

以下是我为自学写的代码

protocol pooPro {
    var a: Int { get }
    var b: Int { get }
    var c: Int { get }

}

extension pooPro {
    func pooFun() -> Int {
        return(a + b + c) //Function A
    }
}

struct bluePrint: pooPro {
    var a: Int
    var b: Int
    var c: Int

    func pooFun() -> Int {
        return(a * 10 + b * 10 + c * 10) // Function B
    }
}

let byBluePrint = bluePrint(a: 1, b: 2, c: 3)
print(byBluePrint.pooFun()) // #1 Use Function B

let byProtocol: pooPro = byBluePrint // #PassingValue
byProtocol.pooFun() //#2 Use Function A

byBluePrint类型的bluePrint对象在调用.pooFun()时调用功能B ; byBluePrint类型的byBluePrint对象已分配给byProtocol类型的pooPro对象,但它不会带来功能B byProtocolbyProtocol对象在调用.pooFun()时会调用函数A

这是因为被调用的属性或方法取决于类型声明的上下文。这真太了不起了! (A部分)

问题1:背后的机制是什么(在A部分中描述),Swift是如何做到的?它可能需要一些编译知识,对初学者来说可能太多了,但我只是好奇而且我想知道

问题2:此处显示的代码是否与我在开头指出的视频有关?换句话说,这是一个正确的例子,表明Swift的面向协议的属性解决了#34;自动共享"传统OO中的问题

非常感谢您的帮助和时间。

2 个答案:

答案 0 :(得分:4)

您已经共享了一个示例,其中将struct的实例强制转换回协议,当您调用该方法时,它会调用协议扩展实现而不是struct实现。

我个人不会过分担心Swift在此协议扩展中使用的精确内部机制,而是建议您注意这种行为。但同样重要的是,请注意,如果协议声明pooFun是协议要求的一部分,那么即使您在调用之前将其转换回协议类型,行为也会突然改变并调用struct实现方法。

就个人而言,我把视频的这一部分作为关于协议扩展的一些特殊行为的警示,而不是任何值得庆祝的事情。我不想编写依赖于这个特定功能的代码,因为在阅读代码时,预期的行为不是不言而喻的。

  

...这是一个正确的例子,表明Swift的面向协议的属性解决了传统OO中的“自动共享”问题

不,这不是解决“自动共享”问题的好例子。通过使用值类型解决了这种共享问题。

协议扩展的目的仅仅是提供共享实现和自定义点。换句话说,它展示了如何在享受价值类型的好处的同时实现可继承和/或可覆盖的行为。

答案 1 :(得分:0)

您的协议定义本身看起来很好。您提供实施者必须实现的参数。

在协议扩展中,您提供了pooFun()方法的默认实现。任何继承您的协议的类或结构都会获得pooFun()的默认实现,而您不必编写任何代码。要对此进行测试,您可以从pooFun()结构中删除bluePrint方法,然后您仍然可以调用它。

如果你想确保类/结构实现一个函数,但希望类提供细节,你可以在协议中定义它:

func pooFun() -> Int

然后是你的协议必须实现它的任何类。