这个问题可能非常错误,我想达到的结果也可能很不明确。我是编程初学者,请指正我的错误理解。通过您的指正,我会学到很多东西。
在 Session 408 的 06:00 WWCD15 的视频,Crusty 提示的类的三大牛之一是“自动共享!” swift的面向协议(protocol)的特性可以很好的解决这个问题。
下面是我自学时写的代码
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
bluePrint
类型的 byBluePrint
对象在调用 .pooFun()
时调用 Function B ; byBluePrint
类型的 byBluePrint
对象被分配给 pooPro
类型的 byProtocol
对象,但它没有将Function B 带到byProtocol
,因此byProtocol
对象在.pooFun 时调用Function A ()
已被调用
这是因为被调用的属性或方法取决于类型声明的上下文。这真太了不起了! (A 部分)
问题 1: 它背后的机制是什么(在 A 部分中描述),Swift 是如何做到的?它可能需要一些编译知识,对于初学者来说可能太多了,但我只是好奇,我想知道
问题2:这里显示的代码与我一开始指出的视频有关吗?换句话说,这是一个正确的例子,表明 Swift 的面向协议(protocol)的属性解决了传统 OO 中的“自动共享”问题
非常感谢您的帮助和时间。
最佳答案
您分享了一个示例,其中您将 struct
的实例转换回协议(protocol),当您调用该方法时,它会调用协议(protocol)扩展实现而不是 struct
实现。
我个人不会太担心 Swift 使用此协议(protocol)扩展的精确内部机制,但我建议您只注意行为。但同样重要的是,请注意,如果协议(protocol)将 pooFun
声明为协议(protocol)要求的一部分,那么行为会突然发生变化,即使您将其强制转换回,也会调用 struct
实现在调用方法之前添加到协议(protocol)类型。
就个人而言,我将视频的这一部分作为关于协议(protocol)扩展的一些特殊行为的警示,而不是任何值得庆祝的事情。我不想编写依赖于此特定功能的代码,因为在阅读代码时预期的行为不是不言而喻的。
... is this a correct example to show the Swift's protocol-oriented properties solved the "Automatic Sharing" problem in traditional OO
不,这不是解决“自动共享”问题的好例子。这个共享问题是通过使用值类型来解决的。
协议(protocol)扩展的目的仅仅是提供共享实现和定制点。换句话说,它展示了如何在享受值类型的好处的同时实现可继承和/或可覆盖的行为。
关于swift - 这是一个正确的例子来展示 Swift 面向协议(protocol)设计的好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37645529/