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.

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)

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


14

Me lo imaginé:

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

Dar crédito a otra persona.


13

hacer:

let intArray = Array(min...max)

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


10

Utilizar map

let min = 50
let max = 100
let intArray = (min...max).map{$0}

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.


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)
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.