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.