扩展中的重新支撑成员有时会隐藏原始成员 *.为什么



偶然地,我发现您可以在不抱怨的情况下执行此操作:

extension Date {
    var timeIntervalSinceNow: TimeInterval {
        return 1000
    }
}

什么是奇怪的,是这个实际评估为1000:

Date().timeIntervalSinceNow
  • 扩展名似乎隐藏了原始成员。

所以我尝试与自己的班级一起做:

class A {
    var a: String {
        return "A"
    }
}
extension A {
    var a: String {
        return "a"
    }
}
  • 它无法编译:"'a'"。

我观察到,这不会通过协议影响原始成员的使用,这是隐藏的预期行为:

extension Date {
    var description: String {
        return "XXXX"
    }
}
let date: CustomStringConvertible = Date()
date.description // normal date
Date().description // "XXXX"

您能解释出子弹尖的现象吗?

这有效,因为您在与原始变量声明的单独模块中声明此扩展名。

在整个模块中,变量名可以被超载,但是在我看来,这是Swift的缺点,因为当前无法明确说明您想要哪个模块声明。

相关内容

最新更新