这个问题可能是非常错误的,我想要达到的结果也可能非常不清楚。我是一名编程入门者,请纠正我错误的理解。通过你的修正,我会学到很多东西。
在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 byProtocol
,byProtocol
对象在调用.pooFun()
时会调用函数A
这是因为被调用的属性或方法取决于类型声明的上下文。这真太了不起了! (A部分)
问题1:背后的机制是什么(在A部分中描述),Swift是如何做到的?它可能需要一些编译知识,对初学者来说可能太多了,但我只是好奇而且我想知道
问题2:此处显示的代码是否与我在开头指出的视频有关?换句话说,这是一个正确的例子,表明Swift的面向协议的属性解决了#34;自动共享"传统OO中的问题
非常感谢您的帮助和时间。
答案 0 :(得分:4)
您已经共享了一个示例,其中将struct
的实例强制转换回协议,当您调用该方法时,它会调用协议扩展实现而不是struct
实现。
我个人不会过分担心Swift在此协议扩展中使用的精确内部机制,而是建议您注意这种行为。但同样重要的是,请注意,如果协议声明pooFun
是协议要求的一部分,那么即使您在调用之前将其转换回协议类型,行为也会突然改变并调用struct
实现方法。
就个人而言,我把视频的这一部分作为关于协议扩展的一些特殊行为的警示,而不是任何值得庆祝的事情。我不想编写依赖于这个特定功能的代码,因为在阅读代码时,预期的行为不是不言而喻的。
...这是一个正确的例子,表明Swift的面向协议的属性解决了传统OO中的“自动共享”问题
不,这不是解决“自动共享”问题的好例子。通过使用值类型解决了这种共享问题。
协议扩展的目的仅仅是提供共享实现和自定义点。换句话说,它展示了如何在享受价值类型的好处的同时实现可继承和/或可覆盖的行为。
答案 1 :(得分:0)
您的协议定义本身看起来很好。您提供实施者必须实现的参数。
在协议扩展中,您提供了pooFun()
方法的默认实现。任何继承您的协议的类或结构都会获得pooFun()
的默认实现,而您不必编写任何代码。要对此进行测试,您可以从pooFun()
结构中删除bluePrint
方法,然后您仍然可以调用它。
如果你想确保类/结构实现一个函数,但希望类提供细节,你可以在协议中定义它:
func pooFun() -> Int
然后是你的协议必须实现它的任何类。