swift convert Range <Int> a [Int]


107

come convertire Range in Array

Provai:

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

ottenere errore Range<Int> is not convertible to [Int]

Ho anche provato:

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

e

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

neanche loro funzionano.

Risposte:


204

È necessario creare un Array<Int>utilizzando Range<Int>piuttosto che lanciarlo .

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

1
grazie, l'ho immaginato mentre
inviavi la

Questo sembra bloccarsi se l'intervallo è grande: let valuesArray: [Int64] = Array (1 ... 4294967292) - forse perché può gestire solo Int e non Int64?
Daniel Springer

2
@DanielSpringer: non è il valore nell'array, che causa il problema, ma l'indice che supera i limiti fissati nella specifica del linguaggio. Si prega di calcolare la quantità di RAM necessaria, solo per contenere questo enorme array.
utente sconosciuto

@userunknown quindi non il tipo di valore, ma la quantità di valori? Gotcha, grazie!
Daniel Springer

1
@Daniel Springer, sembra un'attività in cui dovresti assolutamente usare un RandomGenerator, vedi alcune opzioni qui: hackingwithswift.com/articles/102/…
Klaus Busse


14

L'avevo capito:

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

Dare credito a qualcun altro.


13

fare:

let intArray = Array(min...max)

Questo dovrebbe funzionare perché Arrayha un inizializzatore che accetta SequenceTypee è Rangeconforme a SequenceType.


10

Uso map

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

aggiungere perché funziona sarebbe utile per le persone che stanno leggendo questo tipo di domande. Ad esempio affermando che crea un CoutableClosedRange che implementa il protocollo Sequence, quindi la mappa è possibile e restituisce un nuovo int pigramente quando si esegue l'operazione di mappa. Alcune conoscenze di base sono sempre buone
denis631

Le altre risposte sono interessanti ma questa risponde effettivamente alla domanda. Alla grande.
Dan Rosenstark,

3

È interessante che tu non possa (almeno, con Swift 3 e Xcode 8) utilizzare l' Range<Int>oggetto direttamente:

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

Pertanto, come accennato in precedenza, è necessario "scartare" manualmente la gamma come:

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

Cioè, puoi usare solo letterale.


Il motivo è perché gli intervalli non sono raccolte. La distinzione tra Range e Countable Range è che quest'ultimo può essere ripetuto da un valore Integer. Per questo motivo Countable Range è un tipo di raccolta in swift ma range non lo è.
Corey Zambonie

Esatto, e non me l'aspettavo, cioè due classi di range differenti. Probabilmente a causa dell'interpretazione pitonica di range().
devforfu

1

Da Swift 3 / Xcode 8 esiste un CountableRangetipo che può essere utile:

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]

Può essere utilizzato direttamente in for- inloop:

for i in range {
    print(i)
}

Questo è (ora) il modo corretto per gestire l'attività. Funziona anche in Swift 4.
Ash

0

Puoi implementare intervalli di istanza ClosedRange e Range con reduce () in funzioni come questa.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.