偶然地,我发现您可以在不抱怨的情况下执行此操作:
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的缺点,因为当前无法明确说明您想要哪个模块声明。