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 where
dalla tua dichiarazione del metodo. Quindi solofunc removeObject<T: Equatable>
. Questa domanda è correlata: stackoverflow.com/questions/24091046/...