2017-05-16 18 views
0

私はAnyClass要素(Array<AnyClass>)の配列を持っているとき、私はremove(Element:)を呼び出すことができるようにAnyClass(AKA AnyObject.Type)はEquatableに準拠したいと思いますが、これはEquatableに準拠するようにElementが必要です。`AnyObject.Type`を` Equatable`に適合させるための回避策?

+0

がhttp://stackoverflow.com/questions/24938948/array-extension-to-remove-object-by-valueを参照してください書きます実際は重複している)。 – rmaddy

+0

@rmaddyいいえ、これは、AnyClassの拡張がコンパイラによって許可されていないという事実に固有の質問です。つまり、AnyClassが指定したスレッドで使用されているEquatableに準拠できなくなります。 –

+0

それを達成するためにもっと多くの努力を払う前に、影響を受けるクラスの共通分母、例えばプロトコルを見つけることができるかどうかを検討してください。 * AnyClass/AnyObjectの擬似ジェネリック*は、共通の根拠を見つけるよりも悪いです。 – vadian

答えて

0

私はあなたの達成しようとしていることが可能かどうか、あるいはあなたがこのようにしてやろうとするべきかどうかは実際考えていません。

クラスは、車、ビュー、またはまったく異なるものであれ、一般に実世界のオブジェクトを表します。だから、私が作成したカスタムIクラスと同じように作成することは難しいです。

スウィフトはそれらをどのように比較するのか分かりません。何が同じになるのでしょうか。

ここで必要なものを達成する最も簡単な方法は、このアプリケーションで使用するクラスのジェネリックバージョンを表すカスタムプロトコル/インターフェイスを定義し、それぞれがそれに準拠することを保証することです。

var objs = Array<MyAppClassesProtocol>() 

ともあなたがAnyObjectの代替としてAnyHashableを使用することができスウィフト3以来remove(element:)

1

を使用します。そして、あなたのような何かを行うことができるはず。これは、Equatableプロトコルに準拠する任意の値を表します。代わりに

var array:[AnyObject] = [] 

ちょうどそれがかもしれない(

var array:[AnyHashable] = [] 
関連する問題