偶然的机会,我发现你可以在没有编译器抱怨的情况下做到这一点:
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的一个缺点,因为目前没有办法明确说明你想要的模块声明.