2017-06-09 21 views
1

私は、一般的な配列を含むクラスAAAを持っています。 の項目はEquatableではない可能性がありますので、私はclass AAA<Item: Equatable>としてコード化しません。スウィフトジェネリックアレイ等価キャスト

ItemがEquatableのときに使用できるAAAクラスのremove関数を追加したいと考えています。この関数を呼び出すと、配列拡張の関数が呼び出されます。

の項目は、デフォルトではEquatableではないため、次のコードはコンパイルできません。次のステップで

class AAA<Item> 
{ 
    var items = [Item]() 

    func remove(item: Item) 
    { 
     items.remove(object: item) 
    }  
} 

extension Array where Element: Equatable 
{ 
    // Remove first collection element that is equal to the given `object`: 
    mutating func remove(object: Element) 
    { 
     if let index = index(of: object) 
     { 
      remove(at: index) 
     } 
    } 
} 

、私はEquatableへ項目アイテムを変換してみてください。しかし、の項目の配列をEquatable要素の配列にチェックしてキャストする方法はありません。

func remove<ItemEquatable: Item> (item: ItemEquatable) where ItemEquatable: Equatable 
{ 
    items.remove(object: item) 
} 

ご意見やご提案はありますか?それでも メソッド削除を呼び出すことができますので、あなたのアプローチは働くことができない

class AAA<Item> { 
    var items = [Item]() 
} 

extension AAA where Item: Equatable { 

    func remove(item: Item) { 
     items.remove(object: item) 
    } 
} 

Itemがequatableであれば、 は単にクラスの制限された拡張子に定義を入れるだけAAA<Item>する関数を定義するには感謝

答えて

2

任意のAAA<Item>インスタンスでは、ItemEquatableではありません。

つまり、remove()の引数のタイプではなく、クラスのジェネリックタイプItem を制限する必要があります。