質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

177閲覧

複数種のサブクラスを共通の関数で加工し、同じサブクラスを返したい

workr

総合スコア158

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/10/28 02:41

Swift3 で基底クラス Example をもとに派生した ExampleA, ExampleB, ExampleC, ... などのクラスがあったとします。

それらを共通の関数で処理して、処理後のオブジェクトを返したいと思うのですがその際の型宣言をどのようにしたらいいのでしょうか?

swift

1var foo = ExampleA() // Example を継承したサブクラス 2foo = process(item: foo) // サブクラスなのでエラー 3 4func process(item: Example) -> Example { 5 // 何らかの処理 6 return item 7}

関数は Example を継承したクラスであればどれでも受け付けられるようにしたいのですが、型宣言で Example としてしまうと基底クラスしか受け付けてくれません。また、返り値も同様に基底クラスとして返すことになると思いますが、サブクラス ExampleA を渡せばそのまま ExampleA が返ってくるようにしたいです。

何か良い方法はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ジェネリクス<T>を使います。
また、 T: Example でExampe以外の型を受けつけないようにします。

swift

1func process<T: Example>(item: T) -> T { 2 return T 3}

投稿2017/10/28 03:56

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ジェネリクスが使えます。

swift

1func process<T: Example>(item: T) -> T { 2 3 // 何らかの処理 4 return item 5}

投稿2017/10/28 03:56

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

workr

2017/10/28 04:14

回答ありがとうございます。ちなみにですが、仮に幾つかの子クラスは親クラスにはないプロパティ name を持っていたとして、この関数内で name を書き換えたいと思っても Type 'T' has no member 'name' となってしまいます。こういった場合は小クラスごとに関数を分けるしか無いのでしょうか?(例: processExampleA(), processExampleB() )
MasakiHori

2017/10/28 05:14

やり方が色々ありすぎで提示の断片だけではなんとも言えません。 switchで分けるとかオーバーロードするとか色々あります。
workr

2017/10/28 06:10 編集

プロパティを持っていたらセットするようにしたいのですが基底クラスにプロパティがないのでビルドが失敗してしまいます。メソッド名は適当ですが次のような雰囲気です。 if( item.hasMember("name") ) { item.name = "something" }
MasakiHori

2017/10/28 06:32

質問の内容から逸脱しすぎです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問