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.

Jawaban:


204

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

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

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


14

Saya menemukan jawabannya:

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

Memberi penghargaan kepada orang lain.


13

melakukan:

let intArray = Array(min...max)

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


10

Menggunakan map

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

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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.