2017-06-09 6 views
1

J'ai une classe AAA qui contient un tableau générique. Depuis article pourrait ne pas être équivalent, donc je ne le code pas comme class AAA<Item: Equatable>.Swift Tableau générique Coulée équivalente

Je voudrais ajouter une fonction de suppression dans la classe AAA qui est disponible lorsque l'élément est équivalent. En appelant cette fonction, il appellera une fonction dans l'extension de tableau.

Depuis L'élément n'est pas Equitable par défaut, le code suivant n'est pas capable de compiler.

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) 
     } 
    } 
} 

Dans l'étape suivante, j'essaie de convertir les articles et article dans assimilables. Cependant, je ne trouve aucun moyen de vérifier et de lancer le tableau éléments dans un tableau avec des éléments Equatable.

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

Une idée ou suggestion? Merci

Répondre

2

Pour définir la fonction que pour AAA<Item> si Item est assimilables, mettre simplement la définition dans une extension limitée de la classe:

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

extension AAA where Item: Equatable { 

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

Votre approche ne peut pas travailler parce que vous pouvez toujours appeler la méthode remove sur toute instance AAA<Item>, sans Item étant Equatable. En d'autres termes: Vous devez restreindre le type générique Item de la classe, pas le type de l'argument remove().