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

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

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

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

Q&A

解決済

2回答

3254閲覧

[Swift] 戻り値だけにGenericsを指定した関数の定義

noramimiyuma

総合スコア25

Swift

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

0グッド

0クリップ

投稿2017/02/21 10:46

編集2017/02/21 10:48

enumにパターン別のjsonパーサーを定義したいと思っています。
それぞれのパターンには独自のクラスを別途作り、それに値を与える想定であるため、パターンごとに返却される配列内のクラスが異なります。
(ここでは簡単のため独自クラスKuikiのみ定義しています)

そこで、パターンごとの差異を吸収するため、パーサーの戻り値をジェネリクスにして対応しようと思い以下のコードを書いたのですが、うまくいきません。

これだけの情報で恐縮ですが、なにか解決策はありますでしょうか。

Swift

1enum GisJsonParser { 2 3 case KuikiType 4 5 func parse<T>(json: JSON) -> [T] { 6 switch self { 7 8 case .KuikiType: 9 var kuikiArray: [Kuiki] = [] 10 json["features"].forEach{(_, subjson) in 11 12 var pointArray: [Double] = [0,0] 13 var regionArray: [[Double]] = [[0,0]] 14 15 subjson["geometry"]["coordinates"][0][0].forEach({ (_, subSubJson) in 16 pointArray[0] = subSubJson[0].doubleValue 17 pointArray[1] = subSubJson[1].doubleValue 18 regionArray.append(pointArray) 19 }) 20 21 let kuiki = Kuiki.init(properties: subjson["properties"], 22 cdn: regionArray) 23 kuikiArray.append(kuiki) 24 } 25 return kuikiArray as! [T] // Error: "T" is not a subtype of "Kuiki". 26 } 27 } 28} 29

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

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

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

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

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

domonr

2017/02/21 11:39

「うまくいきません」というのは何がうまくいかないのでしょうか?エラーが出ているのか思った通りに動かないのかとか
ozwk

2017/02/21 14:05

kuikiともう1つパターンがある状況のコード(動かなくていい)を書いてもらえますか?何がしたいのをもう少し知りたいので。
guest

回答2

0

以下の様にキャストすれば良いと思います、失敗する可能性があるのでOptionalにする必要がありますが、、、

swift

1func genericFunc<T>(any:Any) -> T? { 2 return any as? T 3} 4 5let val1: Int? = genericFunc(any: 1) 6//=> Optional(1) 7 8let val2: String? = genericFunc(any: "a") 9//=> Optional("a")

投稿2017/02/21 23:23

_Kentarou

総合スコア8490

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

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

0

自己解決

回答いただいた方々、ありがとうございます。
以下のようにして解決しました。

func parse<T>(json: JSON) -> [T] {

func parse<T>(json: JSON) -> [AnyObject] {
とし、

呼び出す側で
GisJsonParser.KuikiType.parse(json: json)[0] as! Kuiki
とすることで中身を取り出すことができました。

投稿2017/02/21 23:38

noramimiyuma

総合スコア25

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

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

fuzzball

2017/02/22 00:42

Genericsって言ってみたかっただけw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問