私は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
オブジェクトにキャストしないでください。
制約を削除することは、あなたが望むものではありません。 '[T:DomainResource]'は 'DomainResource'に制約された' T'の配列ではありません。*辞書*です。あなたは '[T]'がほしいだけです。プレースホルダ 'T 'は、プレースホルダ宣言において依然として' DomainResource'に制約されている。 'map(_ :)'の 'T'にキャストされた力はまだ分かりませんが、あなたは必ず失敗することはありませんか? – Hamish
この '[T:DomainResource]'は間違った戻り値の型です。あなたは 'T'の代わりに辞書を返しています。 – Rahul
そうです、私は辞書を返していました。それは理にかなっている。また、はい、私たちはデータを標準とマッピングしています。そのため、asは常に動作します。 –