Non è possibile scrivere un metodo su un tipo generico più restrittivo sul modello.
NOTA : come di Swift 2.0, è ora possibile scrivere metodi che sono più restrittive sul modello. Se hai aggiornato il tuo codice a 2.0, vedi altre risposte più in basso per nuove opzioni per implementarlo usando le estensioni.
Il motivo per cui si ottiene l'errore 'T' is not convertible to 'T'è che si sta effettivamente definendo una nuova T nel metodo che non è affatto correlata al T. originale Se si desidera utilizzare T nel metodo, è possibile farlo senza specificarlo sul metodo.
Il motivo per cui si ottiene il secondo errore 'AnyObject' is not convertible to 'T'è che tutti i possibili valori per T non sono tutte le classi. Perché un'istanza sia convertita in AnyObject, deve essere una classe (non può essere una struttura, un enum, ecc.).
La soluzione migliore è renderlo una funzione che accetta l'array come argomento:
func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
}
O invece di modificare l'array originale, puoi rendere il tuo metodo più sicuro e riutilizzabile tramite il thread restituendo una copia:
func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {
}
In alternativa che non consiglio, puoi fare in modo che il tuo metodo fallisca silenziosamente se il tipo memorizzato nell'array non può essere convertito nel modello dei metodi (che è equabile). (Per chiarezza, sto usando U invece di T per il modello del metodo):
extension Array {
mutating func removeObject<U: Equatable>(object: U) {
var index: Int?
for (idx, objectToCompare) in enumerate(self) {
if let to = objectToCompare as? U {
if object == to {
index = idx
}
}
}
if(index != nil) {
self.removeAtIndex(index!)
}
}
}
var list = [1,2,3]
list.removeObject(2) // Successfully removes 2 because types matched
list.removeObject("3") // fails silently to remove anything because the types don't match
list // [1, 3]
Modifica Per superare il fallimento silenzioso puoi restituire il successo come un bool:
extension Array {
mutating func removeObject<U: Equatable>(object: U) -> Bool {
for (idx, objectToCompare) in self.enumerate() { //in old swift use enumerate(self)
if let to = objectToCompare as? U {
if object == to {
self.removeAtIndex(idx)
return true
}
}
}
return false
}
}
var list = [1,2,3,2]
list.removeObject(2)
list
list.removeObject(2)
list
T wheredalla tua dichiarazione del metodo. Quindi solofunc removeObject<T: Equatable>. Questa domanda è correlata: stackoverflow.com/questions/24091046/...