2017-08-11 9 views
0

J'ai créé un type de tableau personnalisé. Maintenant, je veux avoir une méthode de plus, qui peut supprimer l'élément du tableau en passant l'élément réel en tant qu'argument. Je sais que cela peut être réalisé si nous ajoutons l'extension du tableau personnalisé comme Equitable.Comment créer une extension avec Equatable pour supprimer un élément de tableau personnalisé?

Ci-dessous mon code de tableau proxy:

struct ArrayProxy<T> { 
var array: [T] = [] 

mutating func append(newElement: T) { 
    self.array.append(newElement) 

    print("Element added in download queue") 
    DownloadContent.downloadChaptersFromDownloadQueue() 
} 

mutating func removeAtIndex(index: Int) { 
    print("Removed object \(self.array[index]) at index \(index)") 
    self.array.remove(at: index) 
} 

subscript(index: Int) -> T { 
    set { 
     print("Set object from \(self.array[index]) to \(newValue) at index \(index)") 
     self.array[index] = newValue 
    } 
    get { 
     return self.array[index] 
    } 
    } 
} 

ci-dessous est mon extension du tableau proxy

extension ArrayProxy where T: Equatable { 
    mutating func removeElement(element: T) { 
    self.removeAtIndex(index: self.array.index(of: element)!) 
} 
} 
+1

Quelle est votre question? – Sweeper

+0

J'ai mis à jour la question –

+0

En fait, removeElemetat n'est pas accessible. Et j'ai aussi des doutes quant à savoir si je fais bien ou mal? –

Répondre

0

Force de déballer une valeur facultative peut provoquer une erreur.

Si l'index existe index(of:) retourne uniquement le premier index de correspondance.

fix:

extension ArrayProxy where T: Equatable { 

    mutating func removeElement(_ element: T) { 
     var indexs: [Int] = [] 
     for (index, foo) in array.enumerated() { 
      if foo == element { 
       indexs.append(index) 
      } 
     } 
     indexs.sorted(by: >).forEach({ 
      array.remove(at: $0) 
     }) 
    } 
}