Apakah ada cara untuk bekerja dengan rentang terbalik di Swift?
Sebagai contoh:
for i in 5...1 {
// do something
}
adalah lingkaran tak terbatas.
Di versi Swift yang lebih baru yang dikompilasi kode, tetapi pada waktu proses memberikan kesalahan:
Kesalahan fatal: Tidak dapat membentuk Range dengan upperBound <lowerBound
Saya tahu saya dapat menggunakan 1..5
, menghitung, j = 6 - i
dan menggunakan j
sebagai indeks saya. Saya hanya ingin tahu apakah ada yang lebih terbaca?
Jawaban:
Perbarui Untuk Swift 3 terbaru (masih berfungsi di Swift 4)
Anda dapat menggunakan
reversed()
metode ini pada jarak tertentuAtau
stride(from:through:by:)
metodestide(from:to:by:)
serupa tetapi tidak termasuk nilai terakhirPerbarui Untuk Swift terbaru 2
Pertama-tama, ekstensi protokol mengubah cara
reverse
digunakan:for i in (1...5).reverse() { print(i) } // 5 4 3 2 1
Langkah telah dikerjakan ulang di Xcode 7 Beta 6. Penggunaan baru adalah:
Ini juga berfungsi untuk
Doubles
:Berhati-hatilah dengan perbandingan floating point di sini untuk batas-batasnya.
Pengeditan sebelumnya untuk Swift 1.2 : Sejak Xcode 6 Beta 4, oleh dan ReverseRange tidak ada lagi: [
Jika Anda hanya ingin membalikkan rentang, Anda hanya memerlukan fungsi sebaliknya :
Seperti yang diposting oleh 0x7fffffff, ada konstruksi langkah baru yang dapat digunakan untuk mengulangi dan menambah dengan bilangan bulat arbitrer. Apple juga menyatakan bahwa dukungan floating point akan datang.
Bersumber dari jawabannya:
sumber
(1...5).reverse()
(sebagai panggilan fungsi), perbarui jawaban Anda. (Karena hanya dua karakter, saya tidak bisa mengedit posting Anda.)(1...5).reversed()
. Juga, contoh untuk.stride()
tidak berfungsi, dan membutuhkan fungsi gratisstride(from:to:by:)
sebagai gantinya.stride
kode untuk swift 3 sedikit salah. untuk memasukkan nomor 1, Anda perlu menggunakanthrough
lawanto
seperti ini:for i in stride(from:5,through:1,by:-1) { print(i) }
reversed
memiliki kompleksitas O (1) karena ini hanya membungkus koleksi asli dan tidak memerlukan iterasi untuk membuatnya.Ada sesuatu yang meresahkan tentang asimetri ini:
... sebagai lawan dari ini:
Artinya setiap saya ingin melakukan reverse range, saya harus ingat untuk meletakkan tanda kurung, ditambah lagi saya harus menuliskannya
.reverse()
di bagian akhir, menonjol seperti jempol yang sakit. Ini benar-benar jelek dibandingkan dengan gaya C untuk loop, yang simetris menghitung ke atas dan menghitung mundur. Jadi saya cenderung menggunakan C-style untuk loop. Namun di Swift 2.2, loop C-style akan ditiadakan! Jadi saya harus buru-buru mengganti semua gaya C saya yang menurun untuk loop dengan.reverse()
konstruksi jelek ini - bertanya-tanya selama ini, mengapa tidak ada operator jarak mundur?Tapi tunggu! Ini Swift - kami diizinkan untuk menentukan operator kami sendiri !! Kita mulai:
Jadi sekarang saya diizinkan untuk mengatakan:
Ini hanya mencakup kasus paling umum yang terjadi dalam kode saya, tetapi ini merupakan kasus yang paling umum, jadi hanya itu yang saya butuhkan saat ini.
Saya mengalami semacam krisis internal yang datang dengan operator. Saya ingin menggunakan
>..
, sebagai kebalikan dari..<
, tetapi itu tidak legal: Anda tidak dapat menggunakan titik setelah non-titik, itu muncul. Saya mempertimbangkan..>
tetapi memutuskan itu terlalu sulit untuk dibedakan..<
. Hal yang menyenangkan tentang hal itu>>>
adalah ia berteriak pada Anda: " turun ke!" (Tentu saja Anda bebas untuk mencari operator lain. Tetapi saran saya adalah: untuk simetri super, tentukan<<<
untuk melakukan apa..<
, dan sekarang Anda sudah punya<<<
dan>>>
mana yang simetris dan mudah diketik.)Versi Swift 3 (Xcode 8 seed 6):
Versi Swift 4 (Xcode 9 beta 3):
Versi Swift 4.2 (Xcode 10 beta 1):
Versi Swift 5 (Xcode 10.2.1):
sumber
>>>
operatornya keren banget! Saya berharap desainer Swift memperhatikan hal-hal seperti itu, karena menempelreverse()
di akhir ekspresi dalam tanda kurung memang terasa aneh. Tidak ada alasan mereka tidak dapat menangani5>..0
rentang secara otomatis, karenaForwardIndexType
protokol menyediakandistanceTo()
operator yang sangat masuk akal yang dapat digunakan untuk mengetahui apakah langkahnya harus positif atau negatif.Tampaknya jawaban atas pertanyaan ini telah sedikit berubah seiring dengan kemajuan kami melalui beta. Mulai beta 4, baik
by()
fungsi danReversedRange
jenisnya telah dihapus dari bahasa. Jika Anda ingin membuat rentang terbalik, opsi Anda sekarang adalah sebagai berikut:1: Buat rentang maju, lalu gunakan
reverse()
fungsi untuk membalikkannya.2: Gunakan
stride()
fungsi baru yang ditambahkan dalam beta 4, yang mencakup fungsi untuk menentukan indeks awal dan akhir, serta jumlah yang akan diiterasi.Perhatikan bahwa saya juga menyertakan operator jangkauan eksklusif baru di posting ini juga.
..
diganti dengan..<
.Sunting: Dari catatan rilis Xcode 6 beta 5 , Apple menambahkan saran berikut untuk menangani ini:
Berikut contohnya.
sumber
lazy(0....5).reverse()
dan saya tidak melihat catatan rilis beta 5. Apakah Anda mengetahui diskusi lain tentang topik ini? Juga, FYI, angka-angka di dalamfor
loop itu mundur dalam contoh Anda.// 0, 1, 2, 3, 4, 5
tetapi sebenarnya harus dibalik. Komentar itu menyesatkan.Xcode 7, beta 2:
sumber
Swift 3, 4+ : Anda dapat melakukannya seperti ini:
hasil : 10, 9, 8 ... 0
Anda dapat menyesuaikannya sesuka Anda. Untuk info lebih lanjut baca
func sequence<T>
referensisumber
Ini bisa menjadi cara lain untuk melakukan ini.
sumber
Fungsi Reverse () digunakan untuk bilangan terbalik.
Var n: Int // Masukkan nomor
Untuk i in 1 ... n.reverse () {Print (i)}
sumber