item index from for array arrays swift filter casting indexof

arrays - from - Swift: no se puede convertir el valor de tipo a @noescape mientras se llama a indexOf, después del filtro usando la función de filtro



swift 4 index of object in array (1)

El método indexOf en matrices Swift no toma un objeto de un tipo que coincida con el tipo de matriz. En cambio, se necesita un cierre. Ese cierre toma un elemento del tipo de matriz y devuelve un bool.

Entonces, de hecho, ni siquiera nos molestamos con la llamada de filter a menos que realmente necesitemos la matriz resultante. Si solo estamos buscando el primer objeto que pasa la prueba que está filtrando ... bueno, simplemente pasamos la misma prueba a indexOf .

Entonces, para mantener las cosas simples, si tenemos una serie de cadenas (y digamos que todas son cadenas de una sola letra con mucha repetición), y quiero encontrar el primer índice de la cadena "a" , en lugar de filtrar el reduzca a cadenas que son "a" , luego busque la primera cadena que pasó esa prueba con el first método y luego encuentre el índice de ese objeto exacto, en lugar de eso, simplemente paso esa prueba al método indexOf :

let letters: [String] = ["x", "y", "z", "a", "b", "c"] let index = letters.indexOf { $0 == "a" }

Para mayor claridad, parece que simplemente pasar un elemento individual y buscarlo funciona en algunos casos. Probablemente se basa en la conformidad con el protocolo Equatable de Swift. Por ejemplo, podría haber simplificado el uso de letters.indexOf("a") aquí. El compilador hubiera sido feliz. Pero obviamente, no todas las matrices están compuestas para mantener las cosas que se ajustan a Equatable , y la matriz no puede hacer suposiciones sobre cómo comparar sus elementos. En estos casos, tendrá que utilizar el ejemplo anterior de pasar un cierre. Probablemente vale la pena señalar que pasar este cierre a indexOf lugar de primero filtrar y luego llamar a indexOf será mucho más eficiente de todos modos, incluso si su matriz permite el letters.indexOf("a") . Si, por ejemplo, tuviera cadenas más complejas, y solo quisiera la primera cadena que comenzó con la letra ''a'', esto sería mucho, mucho más eficiente que comenzar al filtrar la matriz original a una serie de cadenas que comienzan con '' una''.

En Swift 2, recibo un error:

No se puede convertir el valor del tipo ''[String:AnyObject]'' al tipo de argumento esperado ''@noescape ([String:AnyObject])'' throws -> Bool "

//today = NSDate() //array : [[String:AnyObject]] // I use if let because of we might now get element in the array matching our condition if let elementOfArray = array.filter({$0["id"] as? Int == anotherDictionary["matchID"] as? Int && ($0["nextFireDate"] as? NSDate)?.compare(today) == NSComparisonResult.OrderedAscending}).first { let index = array.indexOf(elementOfArray) // error here }

¿Qué estoy haciendo mal? No puedo entender : /

Mi objetivo es encontrar el índice de ese artículo, creo que abro para soluciones alternativas, pero, por supuesto, esta es la preferida, porque creo que esta es la "forma correcta".