La verificación de conformidad del protocolo equitativo de Swift

Estoy intentando extender la class Array de Swift con la siguiente function:

 func containsObjectIdenticalTo(obj: T) -> Bool { // objectPassingTest returns the first object passing the test return objectPassingTest { x in x == obj } } 

Al parecer, esto no se comstackrá porque el comstackdor aún no lo sabe si == está implementado para el tipo T Luego cambio el código a esto

 func containsObjectIdenticalTo(obj: T) -> Bool { return objectPassingTest { x in assert(x is Equatable && obj is Equatable) return (x as Equatable) == (obj as Equatable) } != nil } 

Lo cual tampoco funciona, ya que la conformidad contra Equatable no se puede verificar (porque Equatable no se definió con @obj ) !

¿Alguna idea de esto? Sería bueno si hay alguna manera de afirmar directamente si T ajusta a Equatable , pero no lo he leído en ninguna parte. Swift parece ser less dynamic que Obj-C en estos productos.

ACTUALIZACIÓN: probé esta sugerencia y no funciona (no sé exactamente qué es lo que <T: Equatable> es para compilation).

 func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool { var x = self[0] var y = self[0] return x == y // Error here } 

Especifique que T debe ser equitativo en la firma del Método:

 func containsObjectIdenticalTo<T: Equatable>(obj: T) -> Bool {/*...*/} 

Qué tal si:

 func containsObjectIdenticalTo<T : Equatable>(obj: T) -> Bool { ... etc ... } 

Al final, recurrí a esta solución

 func containsObjectIdenticalTo<U: Equatable>(obj: U) -> Bool { return objectPassingTest({ x in return x as U == obj }) != nil } 

Puede no ser el mejor (es decir, el más seguro ). Pero funciona muy bien.

Obtengo esto de ExSwift: https://github.com/pNre/ExSwift

  func contains <T: Equatable> (items: T...) -> Bool { return items.all { self.indexOf($0) >= 0 } } func indexOf <U: Equatable> (item: U) -> Int? { if item is Element { if let found = find(reinterpretCast(self) as Array<U>, item) { return found } return nil } return nil } func all (call: (Element) -> Bool) -> Bool { for item in self { if !call(item) { return false } } return true } 

tal vez puedas probarlo