Después de la conversión de Swift 3, no puedo deshacerme del error: "Uso ambiguo de 'indexOfObject (passingTest :)'"

Estoy usando los indexesOfObjects de NSArray (passingTest :), pero después de convertir mi código a Swift 3 obtengo el error: "Uso ambiguo de 'indexOfObject (passingTest :)'". Mi código a continuación funcionó bien con Swift 2.3.

 let indexesOfBubbleConstraints = bubbleConstraints.indexesOfObjects(passingTest: { (constraint, idx, stop) in if let view = constraint.firstItem as? UIView{ return view.tag == usernameTag } else{ return false } }) 

Para Swift 3, también tuve que lanzar constraint a AnyObject , pero eso no soluciona el problema real.

Terminé usando func indexesOfObjects(options: NSEnumerationOptions = [], passingTest: (Any, Int, UnsafeMutablePointer<ObjCBool>) -> Bool) con una matriz vacía para opciones como se muestra a continuación. Esto funciona, pero todavía no entiendo por qué obtengo el error "Ambiguous …" con mi implementación original.

 let indexesOfBubbleConstraints = bubbleConstraints.indexesOfObjects(options: [], passingTest: { (constraint, idx, stop) in if let view = (constraint as AnyObject).firstItem as? UIView{ return view.tag == usernameTag } else{ return false } }) 

En Objective-C, los dos methods indexesOf son distintos dos methods:

 - (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))pnetworkingicate NS_AVAILABLE(10_6, 4_0); - (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))pnetworkingicate NS_AVAILABLE(10_6, 4_0); 

Y ahora, Swift 3 importa esos dos methods ambiguos:

 @available(iOS 4.0, *) open func indexesOfObjects(passingTest pnetworkingicate: (Any, Int, UnsafeMutablePointer<ObjCBool>) -> Bool) -> IndexSet @available(iOS 4.0, *) open func indexesOfObjects(options opts: NSEnumerationOptions = [], passingTest pnetworkingicate: (Any, Int, UnsafeMutablePointer<ObjCBool>) -> Bool) -> IndexSet 

Uno es indexesOfObjects(passingTest:) y otro es indexesOfObjects(options:passingTest:) . Y desafortunadamente, Swift 3 ha dado un valor pnetworkingeterminado para las options parameters, lo que ha hecho que una llamada simple como bubbleConstraints.indexesOfObjects(passingTest: ...) ambigua.

Puede llamar

  • indexesOfObjects(passingTest:)

o

  • indexesOfObjects(options:passingTest:) con el valor pnetworkingeterminado para las options

(Swift no debe dar un valor pnetworkingeterminado, si provoca este tipo de ambigüedad. Es mejor enviar un informe de error).

En este caso, su código de solución, usando indexesOfObjects(options:passingTest:) debería funcionar, pero hay otro trabajo a indexesOfObjects(options:passingTest:) :

 bubbleConstraints.indexesOfObjects(passingTest:) {constraint, idx, stop in //... } 

La reference de método .indexesOfObjects(passingTest:) devuelve el método indexesOfObjects(passingTest:) como un cierre y la expresión anterior lo llama.


Por cierto, es mejor considerar utilizar los methods de recostackción de Swift, en lugar de utilizar un método NSArray :

 let indexesOfBubbleConstraints = bubbleConstraints.enumerated().lazy .filter {(idx, constraint) in //... }.map{$0.offset}