vacio for empty create arreglos array arrays swift standard-library

arrays - empty - for swift



¿Por qué la función reverse() en la biblioteca estándar de Swift devuelve ReverseRandomAccessCollection? (3)

Ahora que aprendí Swift (a un nivel razonable), estoy tratando de familiarizarme con la biblioteca estándar, ¡pero en realidad es principalmente ελληνικά para mí!

Entonces, una pregunta específica: tengo una serie de cadenas y puedo llamar a reverse () en ella.

let arr = ["Mykonos", "Rhodes", "Naxos"].reverse()

Ahora ingenuamente pensé que obtendría un tipo de Array de esto. (Ruby, por ejemplo, tiene un método similar para pasar una matriz y recuperar una matriz)

Pero arr es ahora en realidad de tipo

ReverseRandomAccessCollection<Array<String>>

que en realidad es una estructura, que se ajusta a CollectionType:

public struct ReverseRandomAccessCollection<Base : CollectionType where Base.Index : RandomAccessIndexType> : _ReverseCollectionType

Esto significa que puedo hacer esto:

for item in arr { print(item) }

pero no puedo hacer

print(arr[0])

¿Por qué está diseñado para ser así?

Los diccionarios en Swift también implementan CollectionType, así que puedo hacer esto:

let dict = ["greek" : "swift sometimes", "notgreek" : "ruby for this example"].reverse()

Pero los diccionarios no están ordenados como matrices, entonces ¿por qué puedo llamar a reverse () en los dictados?

Puntos de bonificación si alguien puede señalarme la dirección donde puedo leer y mejorar mi Swift stdlib foo, Ευχαριστώ!


Con Swift 3.0, puede acceder directamente al valor del Array a través del índice.

var streets = ["Albemarle", "Brandywine", "Chesapeake"] streets = streets.reversed() print("Array at index is /(streets[0])")

Esto imprimirá "Chesapeake"


De los documentos de idioma de ReverseCollention (resultado de .reverse() ):

El método reverse () siempre es perezoso cuando se aplica a una colección con índices bidireccionales , pero no confiere implícitamente la pereza en los algoritmos aplicados a su resultado.

En otras palabras, para colecciones ordinarias c que tienen índices bidireccionales:

  • c.reverse () no crea nuevo almacenamiento

...

Por lo tanto, podría ver su ReverseRandomAccessCollection como un contenedor de acceso aleatorio sobre su matriz aún no invertida (es decir, su matriz original arr todavía no se ha copiado e invertido a una nueva posición en la memoria).

Naturalmente, a partir de lo anterior, no puede indexar la colección inversa directamente, ya que una Array da acceso como un puntero a la memoria que contiene la matriz, y la indexación corresponde al avance a nivel de bits (según el tipo) hacia adelante en la memoria. Sin embargo, aún podemos acceder a los elementos de la "matriz inversa" en el estilo de índice de matriz utilizando ReverseRandomAccessIndex :

let arr = ["Mykonos", "Rhodes", "Naxos"] let arrReverse = arr.reverse() /* ReverseRandomAccessCollection access "wrapper" over the ''arr'' data in memory. No new storage allocated */ let myIndex = arrReverse.startIndex.advancedBy(2) /* bIndex type: ReverseRandomAccessIndex<ReverseRandomAccessIndex<Index>> */ print(arrReverse[myIndex]) // "Mykonos"

A la inversa, podemos asignar explícitamente memoria para nuestra matriz inversa y tratarla como cualquier otra matriz. En este punto, arrReverse es una matriz separada de arr , y no tiene ninguna relación con la anterior, salvo que (una vez) se crea al usarla.

let arr = ["Mykonos", "Rhodes", "Naxos"] let arrReverse = Array(arr.reverse()) /* Array<String> */ let myIndex = arrReverse.startIndex.advancedBy(2) /* bIndex type: Int */ print(arrReverse[myIndex]) // "Mykonos"

Martin R me ganó, así que vea su nota sobre los diccionarios .


Es una optimización de rendimiento tanto para tiempo como para memoria. ReverseRandomAccessCollection presenta los elementos de la matriz original en orden inverso, sin la necesidad de crear una nueva matriz y copiar todos los elementos (siempre que la matriz original no esté mutada).

Puede acceder a los elementos invertidos con subíndices:

let el0 = arr[arr.startIndex] let el2 = arr[arr.startIndex.advancedBy(2)]

o

for i in arr.indices { print(arr[i]) }

También puede crear una matriz explícitamente con

let reversed = Array(["Mykonos", "Rhodes", "Naxos"].reversed())

Un diccionario es también una secuencia de pares clave / valor. En

let dict = ["greek" : "swift sometimes", "notgreek" : "ruby for this example"].reverse()

Un método completamente diferente reversed() se llama:

extension SequenceType { /// Return an `Array` containing the elements of `self` in reverse /// order. /// /// Complexity: O(N), where N is the length of `self`. @warn_unused_result public func reversed() -> [Self.Generator.Element] }

El resultado es una matriz con los pares clave / valor del diccionario en orden inverso. Pero esto tiene un uso limitado porque el orden de los pares clave / valor en un diccionario puede ser arbitrario.