Anda dapat menggunakan enumerate
untuk mengonversi urutan ( Array
,, String
dll.) Ke urutan tupel dengan penghitung bilangan bulat dan elemen dipasangkan bersama. Itu adalah:
let numbers = [7, 8, 9, 10]
let indexAndNum: [String] = numbers.enumerate().map { (index, element) in
return "\(index): \(element)"
}
print(indexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
Tautan ke enumerate
definisi
Perhatikan bahwa ini tidak sama dengan mendapatkan indeks koleksi — enumerate
memberi Anda kembali penghitung bilangan bulat. Ini sama dengan indeks untuk array, tetapi pada string atau kamus tidak akan sangat berguna. Untuk mendapatkan indeks aktual bersama dengan setiap elemen, Anda dapat menggunakan zip
:
let actualIndexAndNum: [String] = zip(numbers.indices, numbers).map { "\($0): \($1)" }
print(actualIndexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
Saat menggunakan urutan enumerasi dengan reduce
, Anda tidak akan dapat memisahkan indeks dan elemen dalam sebuah tuple, karena Anda sudah memiliki akumulasi / tuple saat ini dalam tanda tangan metode. Sebagai gantinya, Anda harus menggunakan .0
dan .1
pada parameter kedua untuk reduce
penutupan Anda :
let summedProducts = numbers.enumerate().reduce(0) { (accumulate, current) in
return accumulate + current.0 * current.1
// ^ ^
// index element
}
print(summedProducts) // 56
Swift 3.0 dan lebih tinggi
Karena sintaks Swift 3.0 sangat berbeda.
Anda juga dapat menggunakan sintaks pendek / inline untuk memetakan array pada kamus:
let numbers = [7, 8, 9, 10]
let array: [(Int, Int)] = numbers.enumerated().map { ($0, $1) }
// ^ ^
// index element
Itu menghasilkan:
[(0, 7), (1, 8), (2, 9), (3, 10)]
numbers.enumerate().map { (index, element) in ...
.reduce
setelahenumerate()
atauzip
.enumerate
sekarangenumerated
Karena
Swift 2.1
saya menulis fungsi selanjutnya:Dan kemudian gunakan seperti ini:
sumber
Dengan Swift 3, ketika Anda memiliki objek yang sesuai dengan
Sequence
protokol dan Anda ingin menghubungkan setiap elemen di dalamnya dengan indeksnya, Anda bisa menggunakanenumerated()
metode.Sebagai contoh:
Oleh karena itu, dalam kasus paling sederhana, Anda dapat menerapkan algoritma Luhn di Playground seperti ini:
Jika Anda memulai dari
String
, Anda dapat menerapkannya seperti ini:Jika Anda perlu mengulangi operasi itu, Anda dapat mengubah kode menjadi ekstensi:
Atau, dengan cara yang ringkas:
sumber
Selain contoh Nate Cook
map
, Anda juga dapat menerapkan perilaku inireduce
.Perhatikan bahwa
EnumerateSequence
melewati ke penutupan sebagaienumerated
tidak dapat didekomposisi dalam cara bersarang, sehingga anggota tuple harus diuraikan di dalam penutupan (yaitu.enumerated.index
).sumber
Ini adalah ekstensi CollectionType yang berfungsi untuk swift 2.1 menggunakan throw and rethrows:
Saya tahu ini bukan yang Anda minta, tetapi selesaikan masalah Anda. Anda dapat mencoba metode 2.0 Luhn cepat ini tanpa memperpanjang apa pun:
sumber