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

标签 swift protocols

这个问题可能非常错误,我想达到的结果也可能很不明确。我是编程初学者,请指正我的错误理解。通过您的指正,我会学到很多东西。

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/

相关文章:

ios - 快速内存泄漏

ios - 自定义 UIView 一开始仅覆盖屏幕的一部分

ios - Swift - 使用 IndexSet 获取数组项

ios - 如何快速从协议(protocol)转换/转换为类?

http - 使用http协议(protocol)发送电子邮件?

objective-c - Xcode:可以为协议(protocol)接口(interface)所需的方法自动创建 stub 吗?

swift - 双数的类型在 Swift 中是 Int

swift - 从 firebase swift 获取数据

Android使用数据传输协议(protocol)http或https

clojure - 为什么在导入 Clojure 协议(protocol)时出现 IllegalArgumentException "interface is not a protocol"?