swift - 1 个结构、3 个协议(protocol)和 1 个函数来调用它们

标签 swift polymorphism protocols

我很确定这只适用于类,但不确定是否可以使用结构执行以下操作:

protocol Pro {
    var x: Int {get set}
    mutating func foo()
}

protocol Pro2: Pro {
    var y: Int {get set}
}

protocol Pro3: Pro {
    var z: Int {get set}
}


extension Pro2 {
    mutating func foo() {y *= 2}
}

extension Pro3 {
    mutating func foo() {z += 2}
}


struct Aye: Pro2, Pro3 {
    var x: Int = 0
    var y: Int = 0
    var z: Int = 0

    mutating func foo() {
        // call foo() from Pro2 and Pro3
    }
}

我希望结构从 Pro2Pro3 调用 foo()

最佳答案

目前没有,因为

  • (您可能已经知道)您需要使用 something 实现 Aye#foo,因为有多个默认实现具有相同的签名。
  • 您不能在实现中调用 self.foo 而不会导致无限递归,无论您尝试多少转换。
  • 始终调用结构中的实现而不是默认实现,因此不可能在调用站点进行任何花哨的转换。

我说“目前没有”是因为我不确定这种行为是否是设计使然。正如您所说,这对类(class)来说没有问题。

(我有另一个答案,这太离谱了。感谢 @appzYourLife 更正它。)

关于swift - 1 个结构、3 个协议(protocol)和 1 个函数来调用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38936963/

相关文章:

xcode - Swift 属性 - 避免对 n 个类进行多个声明?

Swift:collectionviewHeader 委托(delegate)不起作用?

swift - RealityKit 在运行时更改 USDZ 漫反射 Material

ios - scrollViewDidScroll 没有在 UIWebView 中被调用

ios - topLayoutGuide 在 vi​​ewWillAppear 之后应用

objective-c - CVMetalTextureGetTexture 所有权?

java - 在java中传递后代而不是接口(interface)

c++ - 使用 `dynamic_cast` 来推断在基类上定义并在派生类上实现的成员函数的参数类型是否正确?

php - 在 Laravel Eloquent 中检索所有 morphedByMany 关系

java - 未指定子协议(protocol)时如何拒绝 WebSocket 连接