以下、クラスがB
でジェネリック型があり、ジェネリック型にはサブクラス型の制約があります。別のクラスA
では、辞書プロパティvalues
を作成し、キーはString
、値はB
です。次に、クラスA
には、値が単一の型に制約されないように、辞書の値を返すか設定するメソッドがあります(のタイプはNSObject
のサブクラスです)。しかし、これは、次の2つのエラーがインライン下記の注意生成します。私はNSObject
のサブクラスであり、すべてがOKになるだろうSomeType
コンパイラに伝えるためにvalues
辞書を宣言するの様々な形態をしようとしましたジェネリックスを使用して辞書の値にアクセスするときにコンパイル時のエラーが発生する
class A: NSObject {
var values = [String : B]()
func get<SomeType: NSObject>(key: String) -> B<SomeType>? {
// #1 Error on line below: cannot convert return expression of type 'B<NSObject>?' to return type 'B<SomeType>?'
return values[key]
}
func set<SomeType: NSObject>(key: String, value: B<SomeType>) {
// #2 Error on line below: cannot assign value of type 'B<SomeType>' to type 'B<NSObject>?'
values[key] = value
}
}
class B<SomeType: NSObject>: NSObject {
}
が、失敗しました。 this questionと同様に、SomeType
というメソッドがNSObject
というサブクラスとして定義されているため、values
から設定して取得するときに型が安全であるように見えるため、ちょっと怪しいです。
私はメソッドからジェネリック型を削除して、代わりに<NSObject>
の型を強制することができますが、私はhereと同じ問題に遭遇します。
お返事ありがとうございます。私は型の消しゴムを使用する限り、私は 'get'メソッドからジェネリックを削除して' B? 'を返し、 'set'メソッドで' values [key] = value.liftGeneric() '?ただし、その場合は、渡された実際の値ではなく、辞書の値のコピーを設定しています。このメソッドを使用して渡された値のインスタンスを設定する方法はありますか? –
ospr
いいえ、その場合、元のオブジェクトを保持してメッセージを渡したより複雑なタイプの消しゴムにする必要があります。ほとんどの場合、私はこれに深く踏み込んだ解決策が過度にジェネリゼーションされていることを明らかにしました。明示的な問題を解決する必要があります(今日のコードでは、あなたはいつか問題があるかもしれません)。時にはジェネリックスの恩恵を受けていることもありますが、何年もの間、ジェネリック医薬品なしで多くの優れたソフトウェアを構築しています。 –
(もっと複雑なクラスベースのタイプの消しゴムを作ることについては、明白な問題を見る必要がありますが、そこには良いサイズはありません。それはあなたのためにすべての解決策です。) –