2017-09-08 4 views
4

偶然、私はあなたがコンパイラ文句なしにこれを行うことができますことを発見:、奇妙何エクステンション内のメンバーを再宣言すると、元のメンバーが*時には*になることはありません。どうして?

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" 

あなたは説明できますか?

+2

あなたのクラス/拡張子「A」が純粋なSwiftであるのに、 'Date'はおそらく古いObjective-C' NSDate'のラッパーですか? – rmaddy

+0

私は '' A' NSObject'と同じエラーのサブクラスが表示されますので、私はそれが理由だとは思わない作ってみました。 @rmaddy – Sweeper

+0

モジュール。モジュール間でこのようにオーバーライドすることができます。しかし元のメンバーにアクセスする方法はわかりません。 –

答えて

1

あなたは、元の変数の宣言から別のモジュールにこの拡張を宣言しているので、これは動作します。

はアクロス変数名は、オーバーロード可能なモジュールが、心の中で、これは明示的にそれはあなたがしたいことをしているモジュールの宣言述べるする方法は現在のところ存在しないようスウィフトの欠点となっています。

+0

この動作はどこに文書化されていますか? – Sweeper

関連する問題