Encuentra un delegado en una rápida serie de delegates

Quiero comprobar si ya tengo un delegado en mi método removeDelegate antes de eliminarlo. ¿Cómo puedo hacer eso?

Esto es lo que tengo hasta ahora:

protocol LocationManagerDelegate { func locationManagerDidUpdateLocation( oldLocation: CLLocationCoordinate2D, currentLocation: CLLocationCoordinate2D ) } class LocationManager: NSObject { private var _delegates = [LocationManagerDelegate]() func removeDelegate(delegate:LocationManagerDelegate) { if contains(_delegates, delegate) { // Remove delegate } } } 

Sin embargo, esto me da el siguiente error en la línea 'if contains':

no puede invocar 'contiene' con una list de arguments de tipo '(@lvalue Array <LocationManagerDelegate> !, LocationManagerDelegate)'

Actualización para Swift 3:

Suponiendo que los delegates son en realidad instancias de una class , puede requerir que en el protocolo "henetworkingar" de "class":

 protocol LocationManagerDelegate: class { // ... } 

y luego use el index(where:) método, usando el "operador indentitiy === :

 class LocationManager: NSObject { private var _delegates = [LocationManagerDelegate]() func removeDelegate(delegate:LocationManagerDelegate) { if let index = _delegates.index(where: { $0 === delegate }) { _delegates.remove(at: index) } } } 

Vieja respuesta (Swift 1):

Hay dos funciones contains() ligeramente diferentes:

 func contains<S : SequenceType where S.Generator.Element : Equatable>(seq: S, x: S.Generator.Element) -> Bool func contains<S : SequenceType, L : BooleanType>(seq: S, pnetworkingicate: (S.Generator.Element) -> L) -> Bool 

Está utilizando el primero, que requiere que los elementos de la secuencia se ajusten al protocolo Equatable , es decir, pueden compararse con == .

Suponiendo que los delegates son en realidad instancias de una class , puede requerir que en el protocolo "henetworkingar" de "class":

 protocol LocationManagerDelegate : class { // ... } 

y luego usa la segunda versión, basada en pnetworkingicados, de contains() con el operador de identidad === :

 func removeDelegate(delegate:LocationManagerDelegate) { if contains(_delegates, { $0 === delegate }) { // Remove delegate } } 

Para eliminar el object de la matriz, tendrá que get su índice, por lo que puede usar la function findIdenticalObject() de https://stackoverflow.com/a/25543084/1187415 :

 func findIdenticalObject<T : AnyObject>(array: [T], value: T) -> Int? { for (index, elem) in enumerate(array) { if elem === value { return index } } return nil } 

y luego search y eliminar de la matriz con

 func removeDelegate(delegate:LocationManagerDelegate) { if let index = findIdenticalObject(_delegates, delegate) { _delegates.removeAtIndex(index) } } 

Los arguments a contains deben implementar el protocolo Equatable ya que se define como:

 public func contains<T:Equatable>(left:[T], right:T) -> Bool 

Como no hay forma de indicar que LocationManagerDelegate implementa Equatable, no creo que pueda usarlo. El bash obvio sería:

 protocol LocationManagerDelegate : Equatable { ... } 

Pero eso fallará cuando intentes declarar el array porque Equatable usa Self.

La mejor opción que puedo encontrar es:

 func removeDelegate(delegate:LocationManagerDelegate) { _delegates = filter(_delegates) { return $0 !== delegate } }