swift indexOf para array

Tratando de get el índice de una matriz ( [AnyObject] ). ¿Qué es lo que me falta?

 extension PageViewController : UIPageViewControllerDelegate { func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [AnyObject]) { let controller: AnyObject? = pendingViewControllers.first as AnyObject? self.nextIndex = self.viewControllers.indexOf(controller) as Int? } } 

He intentado con Swift 1.2 este enfoque:

 func indexOf<U: Equatable>(object: U) -> Int? { for (idx, objectToCompare) in enumerate(self) { if let to = objectToCompare as? U { if object == to { return idx } } } return nil } 

Escriba 'AnyObject?' no cumple con el protocolo 'Equatable' No se puede asignar un valor inmutable del tipo 'Int?'

Necesitamos lanzar el object que estamos probando a un UIViewController , ya que sabemos que hay un set de controllers que contiene UIViewController (y sabemos que UIViewController Equatable con Equatable .

 extension PageViewController : UIPageViewControllerDelegate { func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [AnyObject]) { if let controller = pendingViewControllers.first as? UIViewController { self.nextIndex = self.viewControllers.indexOf(controller) } } } 

La lógica detrás del error es que para que el método indexOf compare el object que pasa, debe compararlos usando el operador == . El protocolo Equatable especifica que la class ha implementado esta function, por lo que esto es lo que indexOf requiere que sus arguments cumplan.

Objective-C no tiene este mismo requisito, pero la implementación real de Objective-C termina significando que el argumento se compara con los objects de la matriz utilizando el método isEqual: (que NSObject y, por lo tanto, todas las classs de Objective-C implementan).

Tienes que convertir la propiedad viewController en un object Array:

 if let controllers = self.viewControllers as? [UIViewController] { self.nextIndex = controllers.indexOf(controller) }