Apakah ada fungsi yang bisa saya gunakan untuk beralih pada array dan memiliki indeks dan elemen, seperti penghitungan Python?
for index, element in enumerate(list):
...
arrays
swift
enumeration
pemikir3
sumber
sumber
enumerate
?enumerating
untuk Swift 4. Menyenangkan!for (index, element) in
saat menggunakanenumerated
itu menyesatkan. seharusnyafor (offset, element) in
Swift 5 menyediakan sebuah metode yang disebut
enumerated()
untukArray
.enumerated()
memiliki deklarasi berikut:Dalam kasus paling sederhana, Anda dapat menggunakan
enumerated()
dengan for loop. Sebagai contoh:Perhatikan bahwa Anda tidak terbatas untuk menggunakan
enumerated()
dengan for loop. Bahkan, jika Anda berencana untuk menggunakanenumerated()
dengan for loop untuk sesuatu yang mirip dengan kode berikut, Anda salah melakukannya:Cara yang lebih cepat untuk melakukan ini adalah:
Sebagai alternatif, Anda juga dapat menggunakan
enumerated()
denganmap
:Selain itu, meskipun memiliki beberapa keterbatasan ,
forEach
bisa menjadi pengganti yang baik untuk for for:Dengan menggunakan
enumerated()
danmakeIterator()
, Anda bahkan dapat mengulang secara manual diArray
. Sebagai contoh:sumber
enumerate
?Dimulai dengan Swift 2, fungsi enumerate perlu dipanggil pada koleksi seperti:
sumber
Saya menemukan jawaban ini sambil mencari cara untuk melakukannya dengan Kamus , dan ternyata cukup mudah untuk mengadaptasinya, cukup berikan tuple untuk elemen tersebut.
sumber
Anda cukup menggunakan loop enumerasi untuk mendapatkan hasil yang Anda inginkan:
Swift 2:
Swift 3 & 4:
Atau Anda bisa melalui loop for untuk mendapatkan hasil yang sama:
Semoga ini bisa membantu.
sumber
Penghitungan dasar
atau dengan Swift 3 ...
Hitung, Saring, dan Peta
Namun, saya paling sering menggunakan enumerate dalam kombinasi dengan peta atau filter. Misalnya dengan mengoperasikan beberapa array.
Dalam array ini saya ingin memfilter elemen yang aneh atau bahkan diindeks dan mengubahnya dari Ints ke Doubles. Jadi
enumerate()
membuat Anda mengindeks dan elemen, lalu menyaring memeriksa indeks, dan akhirnya untuk menyingkirkan tuple yang dihasilkan saya memetakannya hanya elemen.sumber
Menggunakan
.enumerate()
karya, tetapi tidak memberikan indeks sebenarnya dari elemen; itu hanya memberikan Int yang diawali dengan 0 dan bertambah 1 untuk setiap elemen berurutan. Ini biasanya tidak relevan, tetapi ada potensi untuk perilaku yang tidak terduga ketika digunakan denganArraySlice
tipe tersebut. Ambil kode berikut:Ini adalah contoh yang agak dibuat-buat, dan itu bukan masalah umum dalam praktiknya, tetapi saya pikir tetap berharga mengetahui hal ini bisa terjadi.
sumber
it does not actually provide the true index of the element; it only provides an Int beginning with 0 and incrementing by 1 for each successive element
Ya, itu sebabnya ini disebut enumerate . Selain itu, slice bukan array, jadi tidak mengherankan jika berperilaku berbeda. Tidak ada bug di sini - semuanya sesuai desain. :)filter
terlebih dahulu?Dimulai dengan Swift 3, itu
sumber
Untuk kelengkapan Anda dapat dengan mudah beralih pada indeks array Anda dan menggunakan subskrip untuk mengakses elemen pada indeks yang sesuai:
Menggunakan forEach
Menggunakan
enumerated()
metode pengumpulan . Perhatikan bahwa ia mengembalikan koleksi tupel denganoffset
danelement
:menggunakan forEach:
Itu akan dicetak
Jika Anda membutuhkan indeks array (bukan offset) dan elemennya, Anda dapat memperluas Koleksi dan membuat metode Anda sendiri untuk mendapatkan elemen yang diindeks:
Kemungkinan implementasi lain seperti yang disarankan oleh Alex adalah meng-zip indeks koleksi dengan elemen-elemennya:
Pengujian:
Ini akan p [rintis
sumber
enumeratedIndices
dengan looping over denganzip(self.indices, self)
for element in zip(indices, self) { try body(element) }
. Tapi saya tidak suka penamaan yang saya pilih,indexedElements
mungkin menggambarkan lebih baik apa yang dilakukannyafor
loop bekerja, tetapi jugazip(self.indices, self) .forEach(body)
forEach
melakukan perulangan untuk di belakang layar. Saya lebih suka menjaganya agar tetap sederhana github.com/apple/swift/blob/master/stdlib/public/core/…@inlinable public func forEach( _ body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } }
Ini adalah rumus loop Enumeration:
untuk detail lebih lanjut Anda dapat memeriksa Di Sini .
sumber
Saya pribadi lebih suka menggunakan
forEach
metode ini:Anda juga dapat menggunakan versi singkat:
sumber
Xcode 8 dan Swift 3: Array dapat dihitung menggunakan
tempArray.enumerated()
Contoh:
menghibur:
sumber
Bagi yang ingin menggunakan
forEach
.Cepat 4
Atau
sumber
Untuk apa yang ingin Anda lakukan, Anda harus menggunakan
enumerated()
metode pada Array Anda :sumber
Kami memanggil fungsi enumerate untuk mengimplementasikan ini. Suka
sumber