conversión rápida Range <Int> a [Int]

107

cómo convertir Range a Array

Lo intenté:

let min = 50
let max = 100
let intArray:[Int] = (min...max)

obtener error Range<Int> is not convertible to [Int]

También probé:

let intArray:[Int] = [min...max]

y

let intArray:[Int] = (min...max) as [Int] 

ellos tampoco funcionan.

haitham
fuente

Respuestas:

204

Que necesita para crear una Array<Int>utilizando el Range<Int>lugar de fundición ing ella.

let intArray: [Int] = Array(min...max)
David Skrundz
fuente
1
gracias, lo imaginé mientras enviaste tu respuesta
haitham
Esto parece fallar si el rango es grande: let valuesArray: [Int64] = Array (1 ... 4294967292) - ¿tal vez porque solo puede manejar Int y no Int64?
Daniel Springer
2
@DanielSpringer: No es el valor en la matriz lo que causa el problema, sino el índice que excede los límites fijados en la especificación del idioma. Calcule la cantidad de RAM que necesita, solo para sostener esta enorme matriz.
usuario desconocido
@userunknown, ¿no es el tipo de valor, sino la cantidad de valores? ¡Te tengo, gracias!
Daniel Springer
1
@Daniel Springer, eso suena como una tarea en la que definitivamente deberías usar un RandomGenerator, consulta algunas opciones aquí: hackingwithswift.com/articles/102/…
Klaus Busse
37

Ponga el rango en init.

let intArray = [Int](min...max)
Señor Beardsley
fuente
¡Perfecto! Gracias @MrBeardsley
Phillip Jacobs
14

Me lo imaginé:

let intArray = [Int](min...max)

Dar crédito a otra persona.

haitham
fuente
13

hacer:

let intArray = Array(min...max)

Esto debería funcionar porque Arraytiene un inicializador que toma un SequenceTypey se Rangeajusta a SequenceType.

ad121
fuente
10

Utilizar map

let min = 50
let max = 100
let intArray = (min...max).map{$0}
vadian
fuente
agregar por qué funciona sería beneficioso para las personas que están leyendo este tipo de preguntas. Por ejemplo, indicando que crea un CoutableClosedRange que implementa el protocolo Sequence, por lo tanto, el mapa es posible y produce un nuevo int de forma diferida al realizar la operación del mapa. Algunos conocimientos
previos
Las otras respuestas son interesantes, pero esta realmente responde a la pregunta. Grande.
Dan Rosenstark
3

Es interesante que no pueda (al menos, con Swift 3 y Xcode 8) usar el Range<Int>objeto directamente:

let range: Range<Int> = 1...10
let array: [Int] = Array(range)  // Error: "doesn't conform to expected type 'Sequence'"

Por lo tanto, como se mencionó anteriormente, debe "desenvolver" manualmente su rango como:

let array: [Int] = Array(range.lowerBound...range.upperBound)

Es decir, solo puede usar literal.

devforfu
fuente
La razón de esto es que los rangos no son colecciones. La distinción entre rango y rango contable es que este último se puede iterar mediante un valor entero. Por esa razón, Countable Range es un tipo de colección en swift pero range no lo es.
Corey Zambonie
Así es, y no me esperaba esto, es decir, dos clases de rango diferentes. Probablemente debido a la interpretación pitónica de range().
devforfu
1

Desde Swift 3 / Xcode 8 hay un CountableRangetipo que puede ser útil:

let range: CountableRange<Int> = -10..<10
let array = Array(range)
print(array)
// prints: 
// [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Se puede utilizar directamente en for- inbucles:

for i in range {
    print(i)
}
killobatt
fuente
Esta es (ahora) la forma correcta de manejar la tarea. También funciona en Swift 4.
Ash
0

Puede implementar intervalos de instancia ClosedRange & Range con reduce () en funciones como esta.

func sumClosedRange(_ n: ClosedRange<Int>) -> Int {
    return n.reduce(0, +)
}
sumClosedRange(1...10) // 55


func sumRange(_ n: Range<Int>) -> Int {
    return n.reduce(0, +)
}
sumRange(1..<11) // 55
Edison
fuente