konversi cepat Range <Int> ke [Int]

107

bagaimana mengkonversi Range ke Array

Saya mencoba:

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

mendapatkan kesalahan Range<Int> is not convertible to [Int]

Saya juga mencoba:

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

dan

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

mereka juga tidak bekerja.

haitham
sumber

Jawaban:

204

Anda perlu membuat sebuah Array<Int>menggunakan Range<Int>daripada cor ing itu.

let intArray: [Int] = Array(min...max)
David Skrundz
sumber
1
terima kasih, saya baru saja menebaknya saat Anda mengirim jawaban Anda
haitham
Ini sepertinya macet jika rentangnya besar: let valuesArray: [Int64] = Array (1 ... 4294967292) - mungkin karena hanya bisa menangani Int dan bukan Int64?
Daniel Springer
2
@DanielSpringer: Ini bukan nilai dalam Array, yang menyebabkan masalah, tetapi indeks melebihi batas yang ditetapkan dalam spesifikasi bahasa. Harap hitung berapa banyak RAM yang Anda butuhkan, hanya untuk menampung Array yang sangat besar ini.
pengguna tidak diketahui
@userunknown jadi bukan jenis nilainya, tetapi jumlah nilainya? Gotcha, terima kasih!
Daniel Springer
1
@Daniel Springer, kedengarannya seperti tugas di mana Anda harus menggunakan RandomGenerator, lihat beberapa opsi di sini: hackingwithswift.com/articles/102/…
Klaus Busse
37

Letakkan Range di init.

let intArray = [Int](min...max)
Tuan Beardsley
sumber
Sempurna! Terima kasih @MrBeardsley
Phillip Jacobs
14

Saya menemukan jawabannya:

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

Memberi penghargaan kepada orang lain.

haitham
sumber
13

melakukan:

let intArray = Array(min...max)

Ini harus bekerja karena Arraymemiliki penginisialisasi yang mengambil SequenceTypedan Rangesesuai dengan SequenceType.

ad121
sumber
10

Menggunakan map

let min = 50
let max = 100
let intArray = (min...max).map{$0}
vadian
sumber
menambahkan mengapa ini berhasil akan bermanfaat bagi orang-orang yang membaca pertanyaan semacam ini. Misalnya menyatakan bahwa ia membuat CoutableClosedRange yang mengimplementasikan protokol Sequence, oleh karena itu map dimungkinkan dan menghasilkan int baru dengan malas saat melakukan operasi peta. Beberapa latar belakang pengetahuan selalu baik
denis631
Jawaban lainnya menarik tetapi yang ini benar-benar menjawab pertanyaan tersebut. Besar.
Dan Rosenstark
3

Menarik bahwa Anda tidak dapat (setidaknya, dengan Swift 3 dan Xcode 8) menggunakan Range<Int>objek secara langsung:

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

Oleh karena itu, seperti yang disebutkan sebelumnya, Anda perlu "membuka" secara manual rentang Anda seperti:

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

Yaitu, Anda hanya dapat menggunakan literal.

devforfu
sumber
Alasannya adalah karena Rentang bukanlah Koleksi. Perbedaan antara Range dan Countable Range adalah bahwa yang terakhir dapat diulangi dengan nilai Integer. Oleh karena itu, Countable Range adalah jenis koleksi yang cepat tetapi jangkauannya tidak.
Corey Zambonie
Itu benar, dan saya tidak mengharapkan ini, yaitu dua kelas jarak yang berbeda. Mungkin karena interpretasi Pythonic range().
devforfu
1

Karena Swift 3 / Xcode 8 ada CountableRangetipe, yang bisa berguna:

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]

Dapat digunakan langsung di for- inloop:

for i in range {
    print(i)
}
killobatt
sumber
Ini (sekarang) cara yang benar untuk menangani tugas. Juga bekerja di Swift 4.
Ash
0

Anda bisa mengimplementasikan interval instance ClosedRange & Range dengan reduce () dalam fungsi seperti ini.

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
sumber