No puede escribir un método en un tipo genérico que sea más restrictivo en la plantilla.
NOTA : a partir de Swift 2.0, ahora puede escribir métodos que son más restrictivos en la plantilla. Si ha actualizado su código a 2.0, vea otras respuestas más abajo para conocer nuevas opciones para implementar esto usando extensiones.
La razón por la que obtiene el error 'T' is not convertible to 'T'
es que en realidad está definiendo un nuevo T en su método que no está relacionada en absoluto con la T. original. Si desea utilizar T en su método, puede hacerlo sin especificarlo en su método.
La razón por la que obtiene el segundo error 'AnyObject' is not convertible to 'T'
es que todos los valores posibles para T no son todas las clases. Para que una instancia se convierta a AnyObject, debe ser una clase (no puede ser una estructura, enumeración, etc.).
Su mejor opción es hacer que sea una función que acepte la matriz como argumento:
func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
}
O, en lugar de modificar la matriz original, puede hacer que su método sea más seguro y reutilizable devolviendo una copia:
func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {
}
Como alternativa que no recomiendo, puede hacer que su método falle silenciosamente si el tipo almacenado en la matriz no se puede convertir a la plantilla de métodos (eso es equiparable). (Para mayor claridad, estoy usando U en lugar de T para la plantilla del método):
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]
Editar Para superar la falla silenciosa, puede devolver el éxito como 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
de su declaración de método. Por lo que sólofunc removeObject<T: Equatable>
. Esta pregunta está relacionada: stackoverflow.com/questions/24091046/…