6

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

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"

你能解释一下为什么会出现子弹头现象吗?

4

1 回答 1

2

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

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

于 2017-09-09T09:36:47.717 回答