在扩展中重新声明成员会隐藏原始成员*有时*。为什么?

时间:2017-09-08 20:17:40

标签: swift member-hiding

偶然的机会,我发现你可以在没有编译器抱怨的情况下做到这一点:

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"

你能解释为什么子弹出现了现象吗?

1 个答案:

答案 0 :(得分:2)

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

跨模块可以重载变量名,但在我看来这是Swift的一个缺点,因为目前无法明确说明你想要的模块声明。