偶然、私はあなたがコンパイラ文句なしにこれを行うことができますことを発見:、奇妙何エクステンション内のメンバーを再宣言すると、元のメンバーが*時には*になることはありません。どうして?
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"
あなたは説明できますか?
あなたのクラス/拡張子「A」が純粋なSwiftであるのに、 'Date'はおそらく古いObjective-C' NSDate'のラッパーですか? – rmaddy
私は '' A' NSObject'と同じエラーのサブクラスが表示されますので、私はそれが理由だとは思わない作ってみました。 @rmaddy – Sweeper
モジュール。モジュール間でこのようにオーバーライドすることができます。しかし元のメンバーにアクセスする方法はわかりません。 –