Swift: ¿Cómo funciona $ 0 en Array.for?

He visto a la mayoría de los desarrolladores rápidos comenzar a usar .forEach, entendió que es otra forma de iterar array. Pero, ¿cuál es el significado de '$ 0' y cómo funciona? Si es un índice, debería boost 0,1,2 …

@IBOutlet var headingLabels: [UILabel]! .... headingLabels.forEach { $0.attributedText = NSAttributedString(string: $0.text!, attributes: [NSKernAttributeName: 1]) } 

Nombres de arguments de taquigrafía

Swift automáticamente proporciona nombres de arguments de taquigrafía a los cierres en línea, que pueden usarse para referirse a los valores de los arguments del cierre por los nombres $ 0, $ 1, $ 2, y así sucesivamente.

Si utiliza estos nombres de arguments taquicharts dentro de su expresión de cierre, puede omitir la list de arguments del cierre de su definición, y el número y el tipo de los nombres de arguments taquicharts se deducirán del tipo de function esperada. La palabra key in también se puede omitir, ya que la expresión de cierre está compuesta completamente por su cuerpo:

reversed = names.sort ({$ 0> $ 1}) Aquí, $ 0 y $ 1 se refieren a los arguments de la primera y segunda cadena del cierre.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

Respuesta corta

Mira este código

 let nums = [1,2,3,4] nums.forEach { print($0) } 

Aquí el cierre siguiente para forEach

Me refiero a esta parte { print($0) }

se ejecuta 4 veces (una vez por cada elemento dentro de la matriz). Cada vez que se ejecuta $0 contiene una copy del elemento n-th de su matriz de nums .

Entonces, la primera vez contiene 1 , luego 2 y así sucesivamente …

Aquí está el resultado

 1 2 3 4 

Comparando forEach con la construcción for-in

Entonces, ¿podemos decir que $0 es como el valor n en el siguiente código?

 for n in nums { print(n) } 

Sí, tiene casi el mismo significado.

¿Como funciona?

El método forEach acepta un cierre. El cierre tiene esta firma.

 (Self.Generator.Element) throws -> Void 

Cuando usas forEach hace un "contrato" contigo.

  1. Proporciona a forEach un cierre que acepta un forEach único en la input donde el parámetro tiene el mismo tipo de matriz
  2. El forEach aplicará ese cierre a cada elemento de la matriz.

Ejemplo

 nums.forEach { (n) in print(n) } 

Sin embargo, en Swift puede omitir nombres explícitos para los parameters de un cierre. En este interior del cierre puedes referir esos parameters usando $0 para el primer parámetro, $1 para el segundo y así sucesivamente.

Entonces, el fragment de código anterior también se puede escribir como el siguiente

 nums.forEach { print($0) } 

Funciones como "forEach", "sort" se cierran como argumento. Estos cierres también tienen arguments, por ejemplo, para un cierre de la function "forEach", puede proporcionar su propio nombre de un argumento o usar el pnetworkingeterminado "$ 0". Si el cierre tiene múltiples arguments (como la function "orderar"), los pnetworkingeterminados serán "$ 0", "$ 1" si no proporciona ninguno. Tenga en count que los cierres pueden esperar que devuelva algo de valor, como lo hace "orderar". Tienes la lógica, aquí hay un ejemplo:

 let array: [String] = [] array.forEach { element in element.doStuff() } array.forEach { $0.doStuff() } let sortedArray = array.sort { first, second in return first < second } let sortedArray = array.sort { return $0 < $1 }