2017-05-23 4 views
0

私はconstrained genericsでSwift 3を使用しています(つまり、where句)。ジェネリック型キャスティングをしようとしているときに問題があります。ここでは、問題の簡単な例は次のとおりです。拘束付きジェネリックタイプへの迅速なキャスト

func jsonToObj<T:DomainResource>(jsonStr: String) -> [T:DomainResource] { 
    let json = JSON(parseJSON: jsonStr).dictionaryObject 
    let bundle = SMART.Bundle(json: json) 

    let result = bundle.entry?.map() { 
     return $0.resource as! T 
    } 

    return result! 
} 

私の問題は、私はメソッドから返されたときに、コンパイラはそのが[T:DomainResource]を入力するタイプ[T]を変換することはできません文句を言います。ジェネリックからDomainResourceという制約を取り除くと、コンパイルされてうまく動作します。

私はこれを試してみました、私が欲しいものではありませんので、:

let result = bundle.entry?.map() { 
    return $0.resource as! T:DomainResource 
} 

スウィフトは、それが何を意味するのか知っていないようです。どのようにこの問題を回避するための任意のアイデアですか?可能であれば、すべてのオブジェクトをDomainResourceオブジェクトにキャストしないでください。

+0

制約を削除することは、あなたが望むものではありません。 '[T:DomainResource]'は 'DomainResource'に制約された' T'の配列ではありません。*辞書*です。あなたは '[T]'がほしいだけです。プレースホルダ 'T 'は、プレースホルダ宣言において依然として' DomainResource'に制約されている。 'map(_ :)'の 'T'にキャストされた力はまだ分かりませんが、あなたは必ず失敗することはありませんか? – Hamish

+0

この '[T:DomainResource]'は間違った戻り値の型です。あなたは 'T'の代わりに辞書を返しています。 – Rahul

+0

そうです、私は辞書を返していました。それは理にかなっている。また、はい、私たちはデータを標準とマッピングしています。そのため、asは常に動作します。 –

答えて

1

あなたはこの関数シグニチャを書いた:

func jsonToObj<T:DomainResource>(jsonStr: String) -> [T:DomainResource] 

これはjsonToObj(jsonStr:)方法は、キータイプTのものであり、その値はタイプDomainResourceのある辞書を返すと言っています。この関数の署名を書いているようです:

func jsonToObj<T:DomainResource>(jsonStr: String) -> [T] 
+0

それだけです。ありがとうございました。 –

関連する問題