基于类型声明的协议实现行为的差异

时间:2016-12-12 23:13:20

标签: swift

根据显式声明或推断类型,下面的代码给出不同的输出。

  1. 为什么会这样。如果我声明类型,为什么我不能在我的类中实现myFloat?
  2. 如果我想明确声明类型但是还要覆盖扩展中的实现,以便对testClass1.myFloat()的调用返回2.7,我需要做什么?
  3. 这与Xcode 8.1,Swift 2.3

    import UIKit
    
    protocol TestSource {
      func myFloat() -> Float
    }
    
    extension TestSource {
      func myFloat() -> Float {
        return 2.5
      }
    }
    
    protocol TestProtocol: TestSource {
    
    }
    
    class DevClass: TestProtocol {
    
    }
    
    class TestClass: DevClass {
      func myFloat() -> Float {
        return 2.7
      }
    }
    
    
    
    let testClass1: TestProtocol = TestClass()
    testClass1.myFloat() // Returns 2.5
    
    let testClass2 = TestClass()
    testClass2.myFloat() // Returns 2.7
    

1 个答案:

答案 0 :(得分:0)

这不是错误。简短的回答是协议扩展不引入动态调度。有关更详尽的说明,请参阅this answer。那里的解释非常彻底并且包含一个例子。

这是一篇更深入的博客文章:https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future