根据显式声明或推断类型,下面的代码给出不同的输出。
这与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
答案 0 :(得分:0)
这不是错误。简短的回答是协议扩展不引入动态调度。有关更详尽的说明,请参阅this answer。那里的解释非常彻底并且包含一个例子。
这是一篇更深入的博客文章:https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future