Swift
Swiftでダックタイピングをしてみる
Swiftはにはジェネリック関数があり、どんな型でも受け取れる関数が作れる。
Objective-Cはオブジェクトが全てID型として受け取れるのでダックタイピングし放題だが、Swiftはこのジェネリック関数を使って実現することになる。
ただ受け取っただけだと、引数のメンバ変数やメソッドにアクセスできない。
どうもJavaやC#と同じように動的ディスパッチによってジェネリックを実現しているようで、受け取る型の共通の親クラスまで遡ってその型にアップキャストして受け取る、という動きになるらしい。
なので何も継承していないユーザー定義型(自分で作ったクラスのインスタンス)をジェネリックメソッドで受け取ると、Any型まで遡ってしまうようだ。
結果、受け取ったジェネリック関数内では引数の型情報が失われてしまっているため、受け取ったオブジェクトのメンバ変数やメソッドにアクセスできないという厄介な状態になる 。
「どんなオブジェクトでも何でも来い」というメソッドは作れるのだが、受け取った後は「どこに何があるのか知らんけど」となってしまうのだ。
とはいってもさすがに自分が何クラスのインスタンスなのかという情報は残っているので、is演算子で元のクラスを逐一調べてはそれぞれの型にダウンキャストしてメンバ変数やメソッドにアクセスすれば、なんとかダックタイピングのような処理が書ける。
素直に同名メソッドを複数書いてオーバーロードするのとどちらがマシなのかはなんとも言えない感じがする。
|