スウィフトプロトコルは、関数と計算されたプロパティに対して、拡張機能を追加することでデフォルトの実装を提供できます。私はそれを何度もやってきました。 デフォルトの実装は、「代替」としてのみ使用されます。:タイプがプロトコルに準拠しているが、独自の実装を提供していない場合に実行されます。プロトコルで定義されたデフォルトパラメータを持つ関数の実装
少なくとも、それは私がThe Swift Programming Languageガイドを読む方法は次のとおりです。
準拠のタイプは、必要なメソッドやプロパティの独自の実装を提供している場合、その実装は代わりに拡張子が提供するものを使用します。
今、私は特定のプロトコルを実装して、私のカスタムタイプがを行い、状況に遭遇したが、特定の機能の実装を提供するが、それが実行されていない - プロトコル拡張で定義された実装が代わりに実行されます。例えばとして
、私は機能move(to:)
、この機能のためのデフォルトの実装を提供拡張有するプロトコルMovable
定義:
protocol Movable {
func move(to point: CGPoint)
}
extension Movable {
func move(to point: CGPoint = CGPoint(x: 0, y: 0)) {
print("Moving to origin: \(point)")
}
}
次に、私はCar
クラスを定義しますMovable
に準拠しており、move(to:)
関数の独自の実装を提供しています。
class Car: Movable {
func move(to point: CGPoint = CGPoint(x: 0, y: 0)) {
print("Moving to point: \(point)")
}
}
- :私は2つの別々の行動を観察し、私はオプションのパラメータ
point
の値を渡すかどうかに応じてlet castedCar = Car() as Movable
:
は今、私は新しい
Car
作成しMovable
としてそれをダウンキャストオプションのパラメータをポイントに渡す場合
→Car
の実装はと呼ばれる:castedCar.move(to: CGPoint(x: 20, y: 10))
出力:(20.0、10:
がポイントに移動します。0)
-
私はオプションのパラメータに値を与えることなく、
move()
機能
を呼び出すと
がCar
の実装は無視され、
→Movable
プロトコルのデフォルト実装が代わりに:
castedCar.move()
出力:
が原点に移動:(0.0、0.0)
私は、コンパイル時にデフォルト値が追加されると考えていますので、変数の静的型を使用する必要があります。 – Sulthan
CarをMovableにキャストしているので、Movableメソッドが呼び出されます。あなたがCarをMovableにキャストしないと、あなたのCarの移動方法が呼び出されます –
@LeoDabus:あなたが 'Car'を' Movable'にキャストしなければ、私はこの問題に遭遇しません。しかし、私がキャストを実行するときに問題が発生する理由は、私の質問の全体的なポイントです。実際のプロトコル指向の実装では、私が扱っているオブジェクトの実際のクラスを知らないでしょう - 私はそれがプロトコル 'Movable'に準拠していることだけを知っています。 'let castedCar = Car()as Movable'という行は、サンプルコードをきれいに保つために、この状況を模倣する単なる手段です。 – Mischa